spring的事務處理詳解:事務創建
?
sylilzy@163.com
?
在配置spring的事務處理時,無論使用TransactionProxyFactoryBean,還是使用BeanNameAutoProxyCreator
spring的事務處理都是主要由TransactionInterceptor來攔截完成,此類擴展自org.aopalliance.intercept.MethodInterceptor,要查看spring的事務處理過程,首先要了解
TransactionInterceptor類的執行過程:
?
?
?
1.事務攔截器攔截調用方法:invoke();
2.調用TransactionAspectSupport的createTransactionIfNecessary,
?
?
createTransactionIfNecessary中:
首先創建TransactionInfo對象,然后
如果被調用的方法設置了事務屬性(不管是什么屬性,只要設置了),輸出日志:
?
TransactionInterceptor 221 - Getting transaction for ...
?
并調用TransactionManager.getTransaction方法,
?
如果被調用的方法設置未設備事務,輸出:Don't need to create transaction for ...
?
調用返回后然后將事務綁定到當前線程.createTransactionIfNecessary方法返回.
?
3.調用目標類的方法,并依次完成其它攔截器的調用
4.如果在上一步操作中有異常拋出,則會處理異常,處理過程:根據配置決定是提交還是回滾事務
5.如無異常,調用doFinally()將上一個事務(舊事務)設置為當前事務
4.調用doCommitTransactionAfterReturning提交事務,此為最重要的一步,與事務相關的操作在此實際生效.
?
調用TransactionManager.getTransaction過程 :
1.調用doGetTransaction()查找事務(此對象并不代碼一個事務已經存在),返回的對象中包含事務的相關信息:如事務是否開始等.此對象將在以后作為doBegin and doCommit等方法的參數.
?
2.輸出日志:
Using transaction object...
如:
HibernateTransactionManager 254 - Using transaction object...
?
3.調用isExistingTransaction(...)檢查事務是否存在(是否已經開始一個事務),此方法為abstract方法,需要concreate類來實現,例如hibernate
?
4.如果isExistingTransaction為true,
如果是PROPAGATION_NEVER,則拋異常
PROPAGATION_NOT_SUPPORTED,則suspend當前事務并返回
PROPAGATION_REQUIRES_NEW,則suspend后創建一個新事務,
其它則
輸出日志:"Participating in existing transaction"
然后
處理完后返回一個TransactionStatus對象,包含是否為新transaction,是否為新的newSynchronization,suspendedResources等,getTransaction()同時也返回
?
5.
如果isExistingTransaction為false
檢查超時是否小于默認時間,如果是則拋異常
如果當前方法的事務屬性為PROPAGATION_MANDATORY,則拋異常,否則
如果當前方法的事務屬性為PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW,PROPAGATION_NESTED
輸出日志:"Creating new transaction with name ..."
調用doBegin(...)創建并開始一個事務,然后返回
否則返回的return newTransactionStatus(definition, null, false, newSynchronization, debugEnabled, null);