日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

数据库的七种传播方式

發(fā)布時(shí)間:2025/3/21 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库的七种传播方式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

其實(shí)數(shù)據(jù)庫的七種傳播行為在網(wǎng)上查詢了一下,和Spring中使用到的7種事務(wù)傳播行為是沒什么差別的,因?yàn)槲覍懙牟┪幕竞蚃AVA有相關(guān),所以就結(jié)合Spring中事務(wù)傳播和例子來講一下咯。

事務(wù)傳播行為如下:

Require:支持當(dāng)前事務(wù),如果沒有事務(wù),就建一個(gè)新的,這是最常見的

Supports:支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就以非事務(wù)方式執(zhí)行

Mandatory:支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就拋出異常

RequiresNew:新建事務(wù),如果當(dāng)前存在事務(wù),把當(dāng)前事務(wù)掛起;

NotSupported:以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),就把事務(wù)掛起;

Never:以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù),則拋出異常

Nested:新建事務(wù),如果當(dāng)前存在事務(wù),把當(dāng)前事務(wù)掛起。與RequireNew的區(qū)別是與父事務(wù)相關(guān),且有一個(gè)savepoint。即則在嵌套事務(wù)內(nèi)執(zhí)行。

其中,Require、Supports、NotSupported、Never兩個(gè)看文字也就能了解,就不多說了。而Mandatory是要求所有的操作必須在一個(gè)事務(wù)里,較Require來說,對事務(wù)要求的更加嚴(yán)格。

RequireNew:當(dāng)一個(gè)Require方法A調(diào)用RequireNew方法B時(shí),B方法會新new一個(gè)事務(wù),并且這個(gè)事務(wù)和A事務(wù)沒有關(guān)系,也就是說B方法出現(xiàn)異常,不會導(dǎo)致A的回滾,同理當(dāng)B已提交,A再出現(xiàn)異常,B也不會回滾。

Nested:這個(gè)和RequireNew的區(qū)別是B方法的事務(wù)和A方法的事務(wù)是相關(guān)的。只有在A事務(wù)提交的時(shí)候,B事務(wù)都會提交。也就是說當(dāng)A發(fā)生異常時(shí),A、B事務(wù)都回滾,而當(dāng)B出現(xiàn)異常時(shí),B回滾,而A回滾到savepoint,如下代碼所示:

publicvoid A(){

????//操作1

????//操作2

????//操作3

????try{

????????//savepoint

????????B();//一個(gè)Nested的方法

????} catch{

????????//出現(xiàn)異常,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自動配置為聲明式事務(wù)支持?

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

步驟三、在接口或類的聲明處 ,寫一個(gè)@Transactional.

要是只在接口上寫, 接口的實(shí)現(xiàn)類就會繼承下來、接口的實(shí)現(xiàn)類的具體方法,可以覆蓋類聲明處的設(shè)置

@Transactional ? //類級的注解、適用于類中所有的public的方法

事務(wù)的傳播行為和隔離級別

大家在使用spring的注解式事務(wù)管理時(shí),對事務(wù)的傳播行為和隔離級別可能有點(diǎn)不知所措,下邊就詳細(xì)的介紹下以備方便查閱。

事物注解方式: @Transactional

當(dāng)標(biāo)于類前時(shí), 標(biāo)示類中所有方法都進(jìn)行事物處理?,?例子:

@Transactional public classTestServiceBean implements TestService {}

當(dāng)類中某些方法不需要事物時(shí):

@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)?

如果有事務(wù), 那么加入事務(wù), 沒有的話新建一個(gè)(默認(rèn)情況下)

@Transactional(propagation=Propagation.NOT_SUPPORTED)?

容器不為這個(gè)方法開啟事務(wù)

@Transactional(propagation=Propagation.REQUIRES_NEW)?

不管是否存在事務(wù),都創(chuàng)建一個(gè)新的事務(wù),原來的掛起,新的執(zhí)行完畢,繼續(xù)執(zhí)行老的事務(wù)

@Transactional(propagation=Propagation.MANDATORY)?

必須在一個(gè)已有的事務(wù)中執(zhí)行,否則拋出異常

@Transactional(propagation=Propagation.NEVER)?

必須在一個(gè)沒有的事務(wù)中執(zhí)行,否則拋出異常(與Propagation.MANDATORY相反)

@Transactional(propagation=Propagation.SUPPORTS)?

如果其他bean調(diào)用這個(gè)方法,在其他bean中聲明事務(wù),那就用事務(wù).如果其他bean沒有聲明事務(wù),那就不用事務(wù).


?

總結(jié)

以上是生活随笔為你收集整理的数据库的七种传播方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。