数据库的七种传播方式
其實數據庫的七種傳播行為在網上查詢了一下,和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沒有聲明事務,那就不用事務.
?
總結
以上是生活随笔為你收集整理的数据库的七种传播方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库:悲观锁与乐观锁
- 下一篇: 数据库的5种约束