2016-02-11 9 views
8

プログラムによるトランザクションと宣言的トランザクションを混在させた場合の可能性のある同時実行性に関する懸念があります。私はプログラム的な方法でデータベース接続とトランザクションを処理するレガシーソフトウェア(Spring + Hibernate)を開発しています。レガシーソフトウェアでのプログラムによるトランザクションと宣言的トランザクションの混在

Session db = HibernateUtil.getSessionFactory().openSession(); 
db.beginTransaction(); 
// do stuff 
db.getTransaction().commit(); 

ソフトウェアには、宣言的トランザクション(@トランザクション)を持つSpringデータアーキテクチャを使用する新しいモジュールがあります。私たちはまれに、手動で開かれたトランザクションの中から新しいSpringサービスが呼び出されたときに、Microsoft SQL Serverでデータベースのデッドロックを経験しました。問題は、デッドロックを引き起こす同じテーブルを読み書きする2つのネストされたトランザクションがあることです。

Session db = HibernateUtil.getSessionFactory().openSession(); 
db.beginTransaction(); 
// do stuff 
springService.getStuff(); 
// do stuff 
db.getTransaction().commit(); 

これらのトランザクションを安全に混在させる方法と、両方で既に開始したトランザクションを使用する方法はありますか? Spring @ Service/@ Repositoryメソッドを呼び出す前に、手動で/プログラムで開いたトランザクションを閉じるだけでいいですか? SpringとHibernateUtilはどちらもデータベース接続に同じエンティティマネージャを使用します。

答えて

6

トランザクションの動作について言えば、宣言型とプログラム型/手動型の違いはありません。宣言的トランザクションを使用すると、トランザクションの境界をより簡潔かつ判読可能な方法で区切ることができます。 Springでは、トランザクションを開始およびコミット/ロールバックするために手動で行うのと同じことをSpringは行います。

デッドロックの原因となる同じテーブルを読み書きするネストされたトランザクションが2つあることが問題だと思います。

非常に可能です。

これらのトランザクションを安全に混在させる方法や、両方でトランザクションを開始した を使用する方法はありますか?

特定の部品コードで行うのが安全かどうかは、コードの内容によって大きく異なります。ネストされたトランザクションがデッドロックを引き起こす場合、明らかに安全ではなく、ネストされたトランザクションを取得する方法は何もありません(手作業またはSpringは@Transactional(propagation = Propagation.PROPAGATION_REQUIRES_NEW)という注釈付きメソッドをインターセプトするときに開始します)。

私はちょうど春@Service/@Repositoryメソッドを呼び出す前に、手動/プログラムで開かれたトランザクション を閉じるべきでしょうか?

また、解決する必要があるものによって異なります。ネストされたトランザクションが完了したら外部トランザクションを続行する必要がある場合、そうしないでください。それ以外の場合はできます。

TransactionTemplateはSpringとのトランザクションを手動で開始するための推奨方法です。これはSpringがトランザクション境界を認識するためです。つまり、Springアノテーションで宣言的に開始されたトランザクションと同じ扱いになります。

+0

手動で開始されたトランザクションをSpring @ Transactionメソッドに伝播できるかどうか知っていますか? – anssias

+0

@anssias ['TransactionTemplate'](http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/transaction/support/TransactionTemplate.html)をご覧ください。そうした方法でトランザクションを開始すると、Springがトランザクションを認識するため、トランザクションが動作します。 –

+0

それは私が探していたもののように見えます。それをあなたの答えに加えることができますか?私はそれをアンサーとして受け入れます。ありがとうございました! – anssias

関連する問題