2012-06-18 21 views
5

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によって使用される接続ではありません。

私は、PlatformTransactionManagerConnectionHolderに含まれる接続を検索しようとすると、TransactionSynchronizationManagerから検索しました。私はまた、

(基本的には、1つのスレッドが管理対象リソースの独自のインスタンスを取得確保するために Threadlocalを使用) JDBCTemplateJDBCDaoSupport,TransactionSynchronizationManagerは、スレッドごとの接続など、多くのリソースを管理しているため TransactionSynchronizationManager.

から類似したルーチンとの接続を取得しようとしました

したがって、PlatformTransactionManagerとJDBCTemplateまたはJDBCDaoSupportによって取得された接続は同じであると考えられます。これは、スプリングによるプログラムによるトランザクションupdateOperation1(),updateOperation2()のトランザクションによる保護方法を説明します。

私の分析は正しいですか?そうであれば、なぜSpringのドキュメントはこの警告を強調していないのですか?

答えて

2

はい、正しいです。

Connection Sを使用して任意のコードが春(12.3.8 DataSourceTransactionManager)によって管理されるトランザクションに参加するために、特別な方法でDataSourceからそれらを取得する必要があります。

アプリケーションコードはDataSourceUtilsを通じてJDBCコネクションを取得するために必要です.getConnection(DataSource)の代わりにJava EEの標準のDataSource.getConnectionを使用します。

別のオプションは、(あなたがgetConnection()を呼び出すコードを変更することができない場合)TransactionAwareDataSourceProxyであなたのDataSourceをラップすることです。

関連する問題