夢之天堂

          我學故我知,我思故我在;java你我,happy你我——sylilzy

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            3 Posts :: 8 Stories :: 2 Comments :: 0 Trackbacks
          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);

          作者簡介:
          ????施祖陽,網名sylilzy,1979年生。
          ????2002年起從事軟件開發工作,主要研究為JAVA、Linux及相關技術。
          ????你可通過sylilzy@163.com與作者聯系。

          posted on 2006-06-14 18:01 sylilzy 閱讀(3489) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 嘉定区| 台南县| 高邑县| 徐州市| 上饶市| 清涧县| 云安县| 高安市| 延川县| 东城区| 武义县| 西盟| 依兰县| 嘉禾县| 申扎县| 资中县| 汝州市| 阳春市| 遂溪县| 清丰县| 荣成市| 肇东市| 古田县| 威宁| 榆林市| 社旗县| 绍兴县| 弥勒县| 大余县| 镇远县| 新安县| 台南县| 乌兰察布市| 合肥市| 合川市| 合山市| 大荔县| 墨脱县| 崇信县| 石楼县| 乌兰浩特市|