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()
,無論是它與JDBCTemplate
或JDBCDaoSupport
實現的,如果不是,實際上沒有任何事務中執行的操作,是嗎?
我的分析是,如果我們不使用JDBCTemplate
或JDBCDaoSupport
,我們不可避免地會從數據源管理中創建/檢索連接。我們獲得的連接當然不是PlatformTransactionManager
用於管理事務的連接。
我挖春源代碼和脫脂相關類發現PlatformTransactionManager
會嘗試恢復其回報來自TransactionSynchronizationManager
檢索包含在ConnectionHolder
的連接。我還發現JDBCTemplate
和JDBCDaoSupport,
也嘗試從TransactionSynchronizationManager.
因爲TransactionSynchronizationManager
管理許多資源,包括每個線程的連接得到類似的常規連接(基本上使用Threadlocal
,以確保一個線程獲得管理資源的自己獨特的實例)
所以我認爲由PlatformTransactionManager和JDBCTemplate
或JDBCDaoSupport
檢索的連接是一樣的,這可以解釋如何春季編程交易確保updateOperation1(),updateOperation2()
由交易守護。
我的分析是否正確?如果是這樣,爲什麼Spring文檔沒有強調這個警告?