1. 程式人生 > >資料庫的七種傳播方式

資料庫的七種傳播方式

其實資料庫的七種傳播行為在網上查詢了一下,和Spring中使用到的7種事務傳播行為是沒什麼差別的,因為我寫的博文基本和JAVA有相關,所以就結合Spring中事務傳播和例子來講一下咯。

事務傳播行為如下:

Require:支援當前事務,如果沒有事務,就建一個新的,這是最常見的

Supports:支援當前事務,如果當前沒有事務,就以非事務方式執行

Mandatory:支援當前事務,如果當前沒有事務,就丟擲異常

RequiresNew:新建事務,如果當前存在事務,把當前事務掛起;

NotSupported:以非事務方式執行操作,如果當前存在事務,就把事務掛起;

Never:以非事務方式執行,如果當前存在事務,則丟擲異常

Nested:新建事務,如果當前存在事務,把當前事務掛起。與RequireNew的區別是與父事務相關,且有一個savepoint。即則在巢狀事務內執行。

其中,Require、Supports、NotSupported、Never兩個看文字也就能瞭解,就不多說了。而Mandatory是要求所有的操作必須在一個事務裡,較Require來說,對事務要求的更加嚴格。

RequireNew:當一個Require方法A呼叫RequireNew方法B時,B方法會新new一個事務,並且這個事務和A事務沒有關係,也就是說B方法出現異常,不會導致A的回滾,同理當B已提交,A再出現異常,B也不會回滾。

Nested:這個和RequireNew的區別是B方法的事務和A方法的事務是相關的。只有在A事務提交的時候,B事務都會提交。也就是說當A發生異常時,A、B事務都回滾,而當B出現異常時,B回滾,而A回滾到savepoint,如下程式碼所示:

publicvoid A(){

    //操作1

    //操作2

    //操作3

    try{

        //savepoint

        B();//一個Nested的方法

    } catch{

        //出現異常,B方法回滾,A方法回滾到

        //savepoint,也就是說操作1、2、3 都還在

       C();

    } finally{

    }

}  

使用步驟:

步驟一、在spring配置檔案中引入<tx:>名稱空間

<beansxmlns="http://www.springframework.org/schema/beans"

 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 xmlns:tx="http://www.springframework.org/schema/tx"

 xsi:schemaLocation="http://www.springframework.org/schema/beans

 http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

 http://www.springframework.org/schema/tx

 http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

步驟二、具有@Transactional 註解的bean自動配置為宣告式事務支援 

<!-- 事務管理器配置, Hibernate單資料來源事務 --> <bean id="defaultTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"><property name="sessionFactory" ref="sessionFactory"/> </bean> <!-- 使用annotation定義事務--> <tx:annotation-driventransaction-manager="defaultTransactionManager" proxy-target-class="true"/>

步驟三、在介面或類的宣告處 ,寫一個@Transactional.

要是隻在介面上寫, 介面的實現類就會繼承下來、介面的實現類的具體方法,可以覆蓋類宣告處的設定

@Transactional   //類級的註解、適用於類中所有的public的方法

事務的傳播行為和隔離級別

大家在使用spring的註解式事務管理時,對事務的傳播行為和隔離級別可能有點不知所措,下邊就詳細的介紹下以備方便查閱。

事物註解方式: @Transactional

當標於類前時, 標示類中所有方法都進行事物處理 , 例子:

@Transactional public classTestServiceBean implements TestService {}

當類中某些方法不需要事物時:

@Transactional public classTestServiceBean implements TestService { private TestDao dao; publicvoid setDao(TestDao dao) { this.dao = dao; } @Transactional(propagation =Propagation.NOT_SUPPORTED) publicList<Object> getAll() { return null; } }

事物傳播行為介紹: 

@Transactional(propagation=Propagation.REQUIRED) 

如果有事務, 那麼加入事務, 沒有的話新建一個(預設情況下)

@Transactional(propagation=Propagation.NOT_SUPPORTED) 

容器不為這個方法開啟事務

@Transactional(propagation=Propagation.REQUIRES_NEW) 

不管是否存在事務,都建立一個新的事務,原來的掛起,新的執行完畢,繼續執行老的事務

@Transactional(propagation=Propagation.MANDATORY) 

必須在一個已有的事務中執行,否則丟擲異常

@Transactional(propagation=Propagation.NEVER) 

必須在一個沒有的事務中執行,否則丟擲異常(與Propagation.MANDATORY相反)

@Transactional(propagation=Propagation.SUPPORTS) 

如果其他bean呼叫這個方法,在其他bean中宣告事務,那就用事務.如果其他bean沒有宣告事務,那就不用事務.