積累,創(chuàng)造,分享!

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            25 Posts :: 13 Stories :: 26 Comments :: 0 Trackbacks

          常用鏈接

          留言簿(5)

          隨筆檔案(25)

          文章分類(13)

          文章檔案(13)

          相冊(cè)

          其他站點(diǎn)

          友情鏈接

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          在目前使用的現(xiàn)有框架當(dāng)中,利用springAOP機(jī)制來(lái)控制事務(wù)處理是目前最流行的一種控制事務(wù)的方式。

          但是我們?cè)谀撤N使用場(chǎng)合的過(guò)程中,為什么有時(shí)事務(wù)處理老是不起作用呢?這里,為您道出原因之一,

          首先請(qǐng)看一段話

          Spring的事務(wù)實(shí)現(xiàn)采用基于AOP的攔截器來(lái)實(shí)現(xiàn),如果沒(méi)有在事務(wù)配置的時(shí)候注明回滾的checked exception,那么只有在發(fā)生了unchecked exception的時(shí)候,才會(huì)進(jìn)行事務(wù)回滾。

          有必要先解釋一下checked exceptionunchecked exception

          先看看EXCEPTIONJDK文檔當(dāng)中的結(jié)構(gòu)

          java.lang.Object
            繼承者 java.lang.Throwable
                繼承者 java.lang.Exception
                    繼承者 java.lang.RuntimeException
           
          Unchecked exception: 這類異常都是RuntimeException的子類,雖然RuntimeException同樣也是Exception的子類,但是它們是特殊的。Exception是作為checked Exception 出現(xiàn)的。
          所以,除了ErrorRuntimeException,其他剩下的異常都是你需要關(guān)心的,而這些異常類統(tǒng)稱為Checked Exception
           

          有了以上的基礎(chǔ),看看我們框架當(dāng)中的事務(wù)屬性

          <property name="transactionAttributes">

                               <props>

                                      <prop key="get*">PROPAGATION_REQUIRED,readOnly </prop>

                                      <prop key="save*">PROPAGATION_REQUIRED </prop>

                                      <prop key="delete*">PROPAGATION_REQUIRED</prop>

                                      <prop key="update*">PROPAGATION_REQUIRED </prop>

                               </props>

           

          </property>

           

          此處,我們沒(méi)有指定任何異常,那么它目前默認(rèn)處理的就是unchecked exception了,再結(jié)合我們自身每個(gè)項(xiàng)目的模塊,在我們的每個(gè)項(xiàng)目當(dāng)中幾乎都定義了自己的異常,這些異常都是繼承自Exception,很不幸的是,我們繼承的Exception包括自己定義的異常,都是checked exception

           

          所以,在我們的事務(wù)處理機(jī)制當(dāng)中,事務(wù)不管用了。

          解決辦法有2個(gè):

          1,在事務(wù)屬性后面加上需要回滾的checked exception。比如<prop key="save*">PROPAGATION_REQUIRED,-XXXXException</prop>(注意那個(gè)"-",對(duì)應(yīng)的是"+")

          2, 不改配置文件,將需要事務(wù)回滾的異常繼承自unchecked exception類,也就是RuntimeException

          (nighthawk)

          posted on 2007-07-09 09:32 nighthawk 閱讀(2090) 評(píng)論(3)  編輯  收藏

          Feedback

          # re: 誰(shuí)讓事務(wù)控制不起作用了? 2007-07-10 10:14 tozx96
          你說(shuō)的“在我們的事務(wù)處理機(jī)制當(dāng)中,事務(wù)不管用了你說(shuō)的”,是指出現(xiàn)chedked exception時(shí)也會(huì)被commit,還是說(shuō)根本就不commit?  回復(fù)  更多評(píng)論
            

          # re: 誰(shuí)讓事務(wù)控制不起作用了? 2007-07-10 13:35 nighthawk
          事務(wù)不起作用的情況下當(dāng)然是commit了.  回復(fù)  更多評(píng)論
            

          # re: 誰(shuí)讓事務(wù)控制不起作用了? 2007-07-12 11:27 Scott.Pan
          分析的不錯(cuò),收藏了。期待關(guān)于事務(wù)處理的更多精辟見(jiàn)解。  回復(fù)  更多評(píng)論
            


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 静乐县| 屏山县| 太康县| 商水县| 奇台县| 荆州市| 靖安县| 外汇| 新沂市| 精河县| 太和县| 遵义市| 吴忠市| 泗水县| 岳阳市| 乌鲁木齐市| 石首市| 临桂县| 岳阳县| 雷州市| 灵山县| 万安县| 江阴市| 康保县| 恭城| 泽普县| 临颍县| 漯河市| 嘉定区| 高雄县| 广州市| 南昌市| 昆山市| 阿坝县| 镇江市| 龙山县| 凯里市| 秦安县| 无棣县| 道孚县| 阳原县|