spring的AOP事務控制不起作用的原因

在目前使用的現有框架當中,利用springAOP機制來控制事務處理是目前最流行的一種控制事務的方式。

但是我們在某種使用場合的過程中,爲什麼有時事務處理老是不起作用呢?這裏,爲您道出原因之一,

首先請看一段話

Spring的事務實現採用基於AOP的攔截器來實現,如果沒有在事務配置的時候註明回滾的checked exception,那麼只有在發生了unchecked exception的時候,纔會進行事務回滾。

有必要先解釋一下checked exceptionunchecked exception

先看看EXCEPTIONJDK文檔當中的結構

java.lang.Object
  java.lang.Throwable
      java.lang.Exception
          java.lang.RuntimeException
 
而Unchecked exception: 這類異常都是RuntimeException的子類,雖然RuntimeException同樣也是Exception的子類,但是它們是特殊的。Exception是作爲checked Exception 出現的。
所以,除了Error與RuntimeException,其他剩下的異常都是你需要關心的,而這些異常類統稱爲Checked Exception
 

有了以上的基礎,看看我們框架當中的事務屬性

<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>

 

此處,我們沒有指定任何異常,那麼它目前默認處理的就是unchecked exception了,再結合我們自身每個項目的模塊,在我們的每個項目當中幾乎都定義了自己的異常,這些異常都是繼承自Exception,很不幸的是,我們繼承的Exception包括自己定義的異常,都是checked exception

 

所以,在我們的事務處理機制當中,事務不管用了。

解決辦法有2個:

1,在事務屬性後面加上需要回滾的checked exception。比如<prop key="save*">PROPAGATION_REQUIRED,-XXXXException</prop>(注意那個"-",對應的是"+")

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章