2012-06-18 116 views
5

Spring支持編程事務,它使我們能夠對TX管理進行細粒度的控制。
1.使用Spring的TransactionTemplate的:根據Spring文檔,人們可以通過使用編程TX管理春季編程事務管理警告?

transactionTemplate.execute(new TransactionCallbackWithoutResult() { 

protected void doInTransactionWithoutResult(TransactionStatus status) { 
    try { 
     updateOperation1(); 
     updateOperation2(); 
    } catch (SomeBusinessExeption ex) { 
     status.setRollbackOnly(); 
    } 
} }); 

2.直接利用的PlatformTransactionManager(注入PlatformTransactionManager實現到DAO):

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(),無論是它與JDBCTemplateJDBCDaoSupport實現的,如果不是,實際上沒有任何事務中執行的操作,是嗎?

我的分析是,如果我們不使用JDBCTemplateJDBCDaoSupport,我們不可避免地會從數據源管理中創建/檢索連接。我們獲得的連接當然不是PlatformTransactionManager用於管理事務的連接。

我挖春源代碼和脫脂相關類發現PlatformTransactionManager會嘗試恢復其回報來自TransactionSynchronizationManager檢索包含在ConnectionHolder的連接。我還發現JDBCTemplateJDBCDaoSupport,也嘗試從TransactionSynchronizationManager.

因爲TransactionSynchronizationManager管理許多資源,包括每個線程的連接得到類似的常規連接(基本上使用Threadlocal,以確保一個線程獲得管理資源的自己獨特的實例)

所以我認爲由PlatformTransactionManager和JDBCTemplateJDBCDaoSupport檢索的連接是一樣的,這可以解釋如何春季編程交易確保updateOperation1(),updateOperation2()由交易守護。

我的分析是否正確?如果是這樣,爲什麼Spring文檔沒有強調這個警告?

回答

2

是的,這是正確的。

使用原料Connection S的關係從DataSource獲得他們特殊的方式,以參與由Spring的事務管理(12.3.8 DataSourceTransactionManager)任何代碼:

應用程序代碼需要檢索通過DataSourceUtils JDBC連接.getConnection(DataSource)而不是Java EE的標準DataSource.getConnection。

另一種選擇(如果你不能改變調用getConnection()代碼)是TransactionAwareDataSourceProxy來包裝你DataSource