Springは、TX管理をきめ細かく制御できるプログラムによるトランザクションをサポートしています。 SpringのTransactionTemplate利用
1:春のマニュアルによると、一つはにより、プログラムTX管理を使用することができます直接PlatformTransactionManagerを活用Springのプログラムによるトランザクション管理には注意が必要ですか?
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
try {
updateOperation1();
updateOperation2();
} catch (SomeBusinessExeption ex) {
status.setRollbackOnly();
}
} });
2.(DAOへのPlatformTransactionManagerの実装を注入):
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setName("SomeTxName");
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
//txManager is a reference to PlatformTransactionManager
TransactionStatus status = txManager.getTransaction(def);
try {
updateOperation1();
updateOperation2();
}
catch (MyException ex) {
txManager.rollback(status);
throw ex;
}
txManager.commit(status);
用簡略化のために、我々はJDBCデータベース操作を扱っているとしましょう。私は、任意のデータベース操作のために疑問に思って
が第二のスニペットにupdateOperation1(),updateOperation2()
で起こった、どちらかそれはJDBCTemplate
またはJDBCDaoSupport
で実装されている、いない場合は、操作が実際にどのトランザクション内で実行されていない、それを何ですか?
私の分析では、JDBCTemplate
またはJDBCDaoSupport
を使用しないと、必然的にデータソース管理から接続を作成または取得することになります。私たちが得る接続はもちろんトランザクションを管理するために基礎となるPlatformTransactionManager
によって使用される接続ではありません。
私は、PlatformTransactionManager
がConnectionHolder
に含まれる接続を検索しようとすると、TransactionSynchronizationManager
から検索しました。私はまた、
Threadlocal
を使用)
JDBCTemplate
と
JDBCDaoSupport,
も
TransactionSynchronizationManager
は、スレッドごとの接続など、多くのリソースを管理しているため
TransactionSynchronizationManager.
から類似したルーチンとの接続を取得しようとしました
したがって、PlatformTransactionManagerとJDBCTemplate
またはJDBCDaoSupport
によって取得された接続は同じであると考えられます。これは、スプリングによるプログラムによるトランザクションupdateOperation1(),updateOperation2()
のトランザクションによる保護方法を説明します。
私の分析は正しいですか?そうであれば、なぜSpringのドキュメントはこの警告を強調していないのですか?