10.資料庫的七種傳播方式
其實資料庫的七種傳播行為在網上查詢了一下,和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
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沒有宣告事務,那就不用事務.