<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 100  文章 - 50  trackbacks - 0
    <2014年12月>
    30123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    常用鏈接

    留言簿(3)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    收藏夾

    我收藏的一些文章!

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    框架采用的是spring管理聲明式事務,這幾天業務開發時遇到了點麻煩,記錄下備忘。

     

     場景:在Service類中使用子事務(saveponit)時,當子事務拋出異常后,此異常處理掉不繼續往外拋,spring在提交主事務時會拋出

    org.springframework.transaction.UnexpectedRollbackException: Transaction has been rolled back because it has been marked as rollback

     

     方法調用結構:

          假若有A、B、C三個Service類,其實例對象分別為a、b、c,類分別定義如下:

     

                A {

                        方法() {                   //propagation="REQUIRED"

      try{

     

                                    b.方法();

       } catch (Exception e) {

               }

                        }      

       }

     

                B{

                         savePoint方法() {  //propagation="NESTED"

       c.方法(); //如果這里邊的操作全是普通類(不是Service類)操作,不會有問題。

                         }

                 }

     

     

                C{

                          方法() {                 //propagation="REQUIRED"

      throw new Exception("出錯");

         }

     

                  }

     

     

       通過調試spring源碼 

               ......

               Getting transaction for [A.方法] .....

               ......

       Creating nested transaction with name [B.savePoint方法]........

       ......

               Participating in existing transaction

               Getting transaction for [C.方法]

               ........

       Participating transaction failed - marking existing transaction as rollback-only

               //此時,已把主事務標記成了rollback-only

     

               所以,當在a.方法完成時提交事務時會報Transaction has been rolled back because it has been marked as rollback錯誤。

     

               認真的您可能會發現,在 org.springframework.transaction.support.AbstractPlatformTransactionManager 中有個叫

    isGlobalRollbackOnParticipationFailure的參數,默認是true.

     

              源碼中說明:

     

            Switch this to "false" to let the transaction originator make the rollback decision. If a participating transaction fails with an exception, the caller can still decide to continue with a different path within the transaction. However, note that this will only work as long as all participating resources are capable of continuing towards a transaction commit even after a data access failure: This is generally not the case for a Hibernate Session, for example; neither is it for a sequence of JDBC insert/update/delete operations.

     

              大意是:如果isGlobalRollbackOnParticipationFailure為false,則會讓主事務決定回滾,如果當遇到exception加入事務失敗時,調用者能繼續在事務內決定是回滾還是繼續。然而,要注意是那樣做僅僅適用于在數據訪問失敗的情況下且只要所有操作事務能提交。

     

            

        初步解決方案:

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> <property name="globalRollbackOnParticipationFailure" value="false" /> <!--指定此參數為false-->

    </bean>

     

     

        經測試,此問題暫時得到解決,不知道會不會引起其它問題,至少目前還沒有發現其它異常。您若通過此方案解決之后出現了新的問題請留信回復,我們一起交流,非常感謝!

     

    posted on 2014-12-20 14:23 fly 閱讀(598) 評論(0)  編輯  收藏 所屬分類: J2EE
    主站蜘蛛池模板: 黄色成人网站免费无码av| 99久久综合精品免费| 女人18毛片a级毛片免费| 亚洲人成在久久综合网站| 久久福利资源网站免费看| 亚洲国产成人精品久久| 亚洲免费福利视频| 亚洲一区无码中文字幕乱码| 成年黄网站色大免费全看| 亚洲色图黄色小说| 黄在线观看www免费看| 亚洲白嫩在线观看| 国产人成免费视频网站| 亚洲变态另类一区二区三区 | 免费国产污网站在线观看15 | 麻豆最新国产剧情AV原创免费| 亚洲导航深夜福利| 全免费一级午夜毛片| 黄色三级三级免费看| 亚洲日韩激情无码一区| 日韩精品免费在线视频| 亚洲成人一级电影| 国产无遮挡又黄又爽免费视频| 一区二区三区视频免费| 亚洲国产a∨无码中文777| 999国内精品永久免费视频| 亚洲熟妇AV一区二区三区浪潮| 成人永久福利免费观看| A级毛片成人网站免费看| 亚洲欧洲自拍拍偷午夜色| 国产免费卡一卡三卡乱码| a级毛片免费高清毛片视频| 亚洲日韩在线视频| 四虎永久精品免费观看| 久久精品成人免费国产片小草| 亚洲福利视频一区二区三区| 日韩成人免费视频播放| 成人影片一区免费观看| 亚洲综合偷自成人网第页色| 又粗又硬又黄又爽的免费视频| 两个人看的www高清免费观看|