プログラムによるトランザクションと宣言的トランザクションを混在させた場合の可能性のある同時実行性に関する懸念があります。私はプログラム的な方法でデータベース接続とトランザクションを処理するレガシーソフトウェア(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はどちらもデータベース接続に同じエンティティマネージャを使用します。
手動で開始されたトランザクションをSpring @ Transactionメソッドに伝播できるかどうか知っていますか? – anssias
@anssias ['TransactionTemplate'](http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/transaction/support/TransactionTemplate.html)をご覧ください。そうした方法でトランザクションを開始すると、Springがトランザクションを認識するため、トランザクションが動作します。 –
それは私が探していたもののように見えます。それをあなたの答えに加えることができますか?私はそれをアンサーとして受け入れます。ありがとうございました! – anssias