欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

spring事務(wù)隔離級(jí)別、傳播機(jī)制以及簡(jiǎn)單配置方式

 更新時(shí)間:2021年01月28日 09:18:38   作者:Yeah-小海  
這篇文章主要介紹了spring事務(wù)隔離級(jí)別、傳播機(jī)制以及簡(jiǎn)單配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

一、spring支持的事務(wù)聲明方式

1. 編程式事務(wù) 當(dāng)系統(tǒng)需要明確的,細(xì)粒度的控制各個(gè)事務(wù)的邊界,應(yīng)選擇編程式事務(wù)。

2. 聲明式事務(wù) 當(dāng)系統(tǒng)對(duì)于事務(wù)的控制粒度較粗時(shí),應(yīng)該選擇申明式事務(wù),通過(guò)<tx>標(biāo)簽和<aop>切面形式在xml中進(jìn)行配置。

3. 無(wú)論你選擇上述何種事務(wù)方式去實(shí)現(xiàn)事務(wù)控制,spring都提供基于門(mén)面設(shè)計(jì)模式的事務(wù)管理器供選擇,如下是spring事務(wù)中支持的事務(wù)管理器

事務(wù)管理器實(shí)現(xiàn)(org.springframework.*)

使用時(shí)機(jī)

jdbc.datasource.DataSourceTransactionManager

使用jdbc的抽象以及ibatis支持

orm.hibernate.HibernateTransactionManager

使用hibernate支持(默認(rèn)3.0以下版本)

orm.hibernate3.HibernateTransactionManager

使用hibernate3支持

transaction.jta.JtaTransactionManager

使用分布式事務(wù)(分布式數(shù)據(jù)庫(kù)支持)

orm.jpa.JpaTransactionManager

使用jpa做為持久化工具

orm.toplink.TopLinkTransactionManager

使用TopLink持久化工具

orm.jdo.JdoTransactionManager

使用Jdo持久化工具

jms.connection.JmsTransactionManager

使用JMS 1.1+

jms.connection.JmsTransactionManager102

使用JMS 1.0.2

transaction.jta.OC4JJtaTransactionManager

使用oracle的OC4J JEE容器

transaction.jta.WebLogicJtaTransactionManager

在weblogic中使用分布式數(shù)據(jù)庫(kù)

jca.cci.connection.CciLocalTransactionManager

使用jrping對(duì)J2EE Connector Architecture (JCA)和Common Client Interface (CCI)的支持

配置示例如下:

<bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
  <propertyname="dataSource" ref="dataSource"/> //引入數(shù)據(jù)源
</bean>

二、spring支持7種事務(wù)傳播行為

傳播行為

含義

propagation_required(xml文件中為required)

表示當(dāng)前方法必須在一個(gè)具有事務(wù)的上下文中運(yùn)行,如有客戶(hù)端有事務(wù)在進(jìn)行,那么被調(diào)用端將在該事務(wù)中運(yùn)行,否則的話(huà)重新開(kāi)啟一個(gè)事務(wù)。(如果被調(diào)用端發(fā)生異常,那么調(diào)用端和被調(diào)用端事務(wù)都將回滾)

propagation_supports(xml文件中為supports)

表示當(dāng)前方法不必需要具有一個(gè)事務(wù)上下文,但是如果有一個(gè)事務(wù)的話(huà),它也可以在這個(gè)事務(wù)中運(yùn)行

propagation_mandatory(xml文件中為mandatory)

表示當(dāng)前方法必須在一個(gè)事務(wù)中運(yùn)行,如果沒(méi)有事務(wù),將拋出異常

propagation_nested(xml文件中為nested)

表示如果當(dāng)前方法正有一個(gè)事務(wù)在運(yùn)行中,則該方法應(yīng)該運(yùn)行在一個(gè)嵌套事務(wù)中,被嵌套的事務(wù)可以獨(dú)立于被封裝的事務(wù)中進(jìn)行提交或者回滾。如果封裝事務(wù)存在,并且外層事務(wù)拋出異常回滾,那么內(nèi)層事務(wù)必須回滾,反之,內(nèi)層事務(wù)并不影響外層事務(wù)。如果封裝事務(wù)不存在,則同propagation_required的一樣

propagation_never(xml文件中為never)

表示當(dāng)方法務(wù)不應(yīng)該在一個(gè)事務(wù)中運(yùn)行,如果存在一個(gè)事務(wù),則拋出異常

propagation_requires_new(xml文件中為requires_new)

表示當(dāng)前方法必須運(yùn)行在它自己的事務(wù)中。一個(gè)新的事務(wù)將啟動(dòng),而且如果有一個(gè)現(xiàn)有的事務(wù)在運(yùn)行的話(huà),則這個(gè)方法將在運(yùn)行期被掛起,直到新的事務(wù)提交或者回滾才恢復(fù)執(zhí)行。

propagation_not_supported(xml文件中為not_supported)

表示該方法不應(yīng)該在一個(gè)事務(wù)中運(yùn)行。如果有一個(gè)事務(wù)正在運(yùn)行,他將在運(yùn)行期被掛起,直到這個(gè)事務(wù)提交或者回滾才恢復(fù)執(zhí)行

三、spring中的事務(wù)隔離級(jí)別

隔離級(jí)別

含義

isolation_default

使用數(shù)據(jù)庫(kù)默認(rèn)的事務(wù)隔離級(jí)別

isolation_read_uncommitted

允許讀取尚未提交的修改,可能導(dǎo)致臟讀、幻讀和不可重復(fù)讀

isolation_read_committed

允許從已經(jīng)提交的事務(wù)讀取,可防止臟讀、但幻讀,不可重復(fù)讀仍然有可能發(fā)生

isolation_repeatable_read

對(duì)相同字段的多次讀取的結(jié)果是一致的,除非數(shù)據(jù)被當(dāng)前事務(wù)自生修改??煞乐古K讀和不可重復(fù)讀,但幻讀仍有可能發(fā)生

isolation_serializable

完全服從acid隔離原則,確保不發(fā)生臟讀、不可重復(fù)讀、和幻讀,但執(zhí)行效率最低。

臟讀、不可重復(fù)讀、幻象讀概念說(shuō)明:

a.臟讀:指當(dāng)一個(gè)事務(wù)正字訪問(wèn)數(shù)據(jù),并且對(duì)數(shù)據(jù)進(jìn)行了修改,而這種數(shù)據(jù)還沒(méi)有提交到數(shù)據(jù)庫(kù)中,這時(shí),另外一個(gè)事務(wù)也訪問(wèn)這個(gè)數(shù)據(jù),然后使用了這個(gè)數(shù)據(jù)。因?yàn)檫@個(gè)數(shù)據(jù)還沒(méi)有提交那么另外一個(gè)事務(wù)讀取到的這個(gè)數(shù)據(jù)我們稱(chēng)之為臟數(shù)據(jù)。依據(jù)臟數(shù)據(jù)所做的操作肯能是不正確的。

b.不可重復(fù)讀:指在一個(gè)事務(wù)內(nèi),多次讀同一數(shù)據(jù)。在這個(gè)事務(wù)還沒(méi)有執(zhí)行結(jié)束,另外一個(gè)事務(wù)也訪問(wèn)該同一數(shù)據(jù),那么在第一個(gè)事務(wù)中的兩次讀取數(shù)據(jù)之間,由于第二個(gè)事務(wù)的修改第一個(gè)事務(wù)兩次讀到的數(shù)據(jù)可能是不一樣的,這樣就發(fā)生了在一個(gè)事物內(nèi)兩次連續(xù)讀到的數(shù)據(jù)是不一樣的,這種情況被稱(chēng)為是不可重復(fù)讀。

c.幻象讀:一個(gè)事務(wù)先后讀取一個(gè)范圍的記錄,但兩次讀取的紀(jì)錄數(shù)不同,我們稱(chēng)之為幻象讀(兩次執(zhí)行同一條 select 語(yǔ)句會(huì)出現(xiàn)不同的結(jié)果,第二次讀會(huì)增加一數(shù)據(jù)行,并沒(méi)有說(shuō)這兩次執(zhí)行是在同一個(gè)事務(wù)中)

四、spring事務(wù)只讀屬性

spring事務(wù)只讀的含義是指,如果后端數(shù)據(jù)庫(kù)發(fā)現(xiàn)當(dāng)前事務(wù)為只讀事務(wù),那么就會(huì)進(jìn)行一系列的優(yōu)化措施。它是在后端數(shù)據(jù)庫(kù)進(jìn)行實(shí)施的,因此,只有對(duì)于那些有可能啟動(dòng)一個(gè)新事務(wù)的傳播行為(REQUIRED,REQUIRES_NEW,NESTED)的方法來(lái)說(shuō),才有意義。(測(cè)試表明,當(dāng)使用JDBC事務(wù)管理器并設(shè)置當(dāng)前事務(wù)為只讀時(shí),并不能發(fā)生預(yù)期的效果,即能執(zhí)行刪除,更新,插入操作)

五、spring的事務(wù)超時(shí)

有的時(shí)候?yàn)榱讼到y(tǒng)中關(guān)鍵部分的性能問(wèn)題,它的事務(wù)執(zhí)行時(shí)間應(yīng)該盡可能的短。因此可以給這些事務(wù)設(shè)置超時(shí)時(shí)間,以秒為單位。我們知道事務(wù)的開(kāi)始往往都會(huì)發(fā)生數(shù)據(jù)庫(kù)的表鎖或者被數(shù)據(jù)庫(kù)優(yōu)化為行鎖,如果允許時(shí)間過(guò)長(zhǎng),那么這些數(shù)據(jù)會(huì)一直被鎖定,影響系統(tǒng)的并發(fā)性。

因?yàn)槌瑫r(shí)時(shí)鐘是在事務(wù)開(kāi)始的時(shí)候啟動(dòng),因此只有對(duì)于那些有可能啟動(dòng)新事物的傳播行為(REQUIRED,REQUIRES_NEW,NESTED)的方法來(lái)說(shuō),事務(wù)超時(shí)才有意義。

六、事務(wù)回滾規(guī)則

spring中可以指定當(dāng)方法執(zhí)行并拋出異常的時(shí)候,哪些異?;貪L事務(wù),哪些異常不回滾事務(wù)。默認(rèn)情況下,只在方法拋出運(yùn)行時(shí)異常的時(shí)候才回滾(runtime exception)。而在出現(xiàn)受阻異常(checked exception)時(shí)不回滾事務(wù)。當(dāng)然可以采用申明的方式指定哪些受阻異常像運(yùn)行時(shí)異常那樣指定事務(wù)回滾。

七、單個(gè)方法的事務(wù)傳播機(jī)制(注意這里說(shuō)的是單個(gè)方法)

1、整備工作: spring申明式事務(wù)配置,將aop,tx命名空間添加到當(dāng)前的spring配置文件頭中,這里不在累述

2、定義一個(gè)事務(wù)AOP通知(add開(kāi)頭名單方法)

<tx:advice id="txAdvice" transactionManager="transactionManager"> 
 <tx:attributes> 
  <tx:methodname="add*" propagation="REQUIRED"/> 
 </tx:attributes> 
</tx:advice>

3、定義一個(gè)事務(wù)切面,即應(yīng)該在哪些類(lèi)的哪些方法上面進(jìn)行事務(wù)切入,多個(gè)包體可以使用||隔開(kāi)

<aop:config> 
 <aop:advisor pointcut="execution(* *..zx.spring.UserService*.*(..))||execution(**..spring.ServiceFacade.*(..))||execution(**..spring.BookService.*(..))" 
advice-ref="txAdvice"/> 
</aop:config>

4、事務(wù)通知中Propagation設(shè)置為7中傳播行為的情況如下(單方法):

@1、方法的事務(wù)傳播機(jī)制為REQUIRED, REQUIRES_NEW,并且拋出運(yùn)行時(shí)異常時(shí),將回滾事務(wù)。當(dāng)方法拋出受檢查的異常時(shí),將不會(huì)回滾事務(wù)。

@2、方法的事務(wù)傳播機(jī)制為MANDATORY,由于單個(gè)方法執(zhí)行沒(méi)有指定任何事務(wù)傳播機(jī)制,因此拋出異常。

@3、方法的事務(wù)傳播機(jī)制為NESTED,由于NESTED內(nèi)嵌事務(wù),如果沒(méi)有外層事務(wù),則新建一個(gè)事務(wù),行為同REQUIRED一樣。

@4、方法的事務(wù)傳播機(jī)制為NEVER,由于發(fā)生運(yùn)行時(shí)異常,事務(wù)本應(yīng)該回滾,但是事務(wù)傳播機(jī)制為NEVER,因此找不到事務(wù)進(jìn)行回滾。

@5、方法的事務(wù)傳播機(jī)制為NOT_SUPPORTED,單個(gè)方法被執(zhí)行時(shí),不會(huì)創(chuàng)建事務(wù)。如果當(dāng)前有事務(wù),將封裝事務(wù)掛起,知道該方法執(zhí)行完成再恢復(fù)封裝事務(wù),繼續(xù)執(zhí)行。

@6、方法的事務(wù)傳播機(jī)制為SUPPORTS,單個(gè)方法 調(diào)用時(shí)supports行為同NEVER一樣,不會(huì)創(chuàng)建事務(wù),只是如果有事務(wù),則會(huì)加入到當(dāng)前事務(wù)中去。

八、多個(gè)方法間的事務(wù)傳播機(jī)制(注意這里說(shuō)的是多個(gè)方法)

1、整備工作: spring申明式事務(wù)配置,將aop,tx命名空間添加到當(dāng)前的spring配置文件頭中,不在累述。

2、定義一個(gè)事務(wù)AOP通知(add開(kāi)頭名單方法)

<tx:advice id="txAdvice" transactionManager="transactionManager"> 
 <tx:attributes> 
  <tx:methodname="add*" propagation="REQUIRED"/>
<tx:methodname="update*" propagation="REQUIRED"/> 
 </tx:attributes> 
</tx:advice>

3、定義一個(gè)事務(wù)切面,即應(yīng)該在哪些類(lèi)的哪些方法上面進(jìn)行事務(wù)切入

<aop:config> 
 <aop:advisor pointcut="execution(**..zx.spring.UserService*.*(..))||execution(**..spring.ServiceFacade.*(..))||execution(**..spring.BookService.*(..))" 
advice-ref="txAdvice"/> 
</aop:config>

4、事務(wù)通知中Propagation設(shè)置為7中傳播行為的情況如下(多方法間傳遞):

@1、多個(gè)方法的事務(wù)傳播機(jī)制都為REQUIRED,由于REQUIRED方式是如果有一個(gè)事務(wù),則加入事務(wù)中,如果沒(méi)有,則新建一個(gè)事務(wù),也就是說(shuō)方法1一開(kāi)始就會(huì)創(chuàng)建一個(gè)事務(wù),而方法2發(fā)現(xiàn)有事務(wù)存在則會(huì)加入到事務(wù)中,方法2拋出運(yùn)行時(shí)異常,整個(gè)事務(wù)將會(huì)回滾。如果方法2拋出的是可捕獲異常,事務(wù)將不起作用,方法1執(zhí)行成功插入,方法2異常中斷?;蛘呶覀儗⒎椒?設(shè)置rollback-for屬性,那么在指定的異常之內(nèi)事務(wù)都將回滾

@2、方法1的事務(wù)傳播機(jī)制為REQUIRED,方法2的事務(wù)傳播機(jī)制為NEVER,由于方法1會(huì)創(chuàng)建一個(gè)事務(wù),而方法2是NEVER,不應(yīng)該在事務(wù)中運(yùn)行,因此導(dǎo)致了沖突會(huì)報(bào)錯(cuò)。Existingtransaction found for transaction marked with propagation 'never'

@3、方法1的事務(wù)傳播機(jī)制為REQUIRED,方法2的事務(wù)傳播機(jī)制為MANDATORY,執(zhí)行機(jī)制和@1一致。

@4、方法1的事務(wù)傳播機(jī)制為REQUIRED,方法2的事務(wù)傳播機(jī)制為NESTED,內(nèi)嵌事務(wù),也就是方法1執(zhí)行體內(nèi)放入方法2的調(diào)用,由于方法2的事務(wù)傳播機(jī)制為NESTED內(nèi)嵌事務(wù),因此,開(kāi)始一個(gè)新的事務(wù)。并且方法2內(nèi)部拋出RuntimeException,因此內(nèi)部嵌套事務(wù)回滾到外層事務(wù)創(chuàng)建的保存點(diǎn)。

注意這個(gè)地方,我們拋出的是運(yùn)行時(shí)異常,如果我們拋出受檢查的異常,那么spring會(huì)默認(rèn)的忽略此異常。

如果內(nèi)層事務(wù)拋出檢查異常,那么外層事務(wù)將忽略此異常,但是會(huì)產(chǎn)生一個(gè)問(wèn)題。那就是:外層事務(wù)使用jdbc的保存點(diǎn)API來(lái)實(shí)現(xiàn)嵌套事務(wù),

但是數(shù)據(jù)庫(kù)不一定支持。我做測(cè)試的是oracle數(shù)據(jù)庫(kù),jdbc事務(wù)管理器在內(nèi)層事務(wù)拋出檢查異常后,將會(huì)在內(nèi)層事務(wù)結(jié)束后,釋放外層事務(wù)創(chuàng)建的保存點(diǎn),這個(gè)時(shí)候數(shù)據(jù)庫(kù)不一定支持。因此可能會(huì)拋出如下異常java.sql.SQLException:不支持的特性。

總結(jié): 對(duì)于NESTED內(nèi)層事務(wù)而言,內(nèi)層事務(wù)獨(dú)立于外層事務(wù),可以獨(dú)立遞交或者回滾,如果內(nèi)層事務(wù)拋出的是運(yùn)行異常,外層事務(wù)進(jìn)行回滾,內(nèi)層事務(wù)也會(huì)進(jìn)行回滾。

@5、方法1的事務(wù)傳播機(jī)制為REQUIRED,方法2的事務(wù)傳播機(jī)制為REQUIRES_NEW。(情況比較復(fù)雜)

情況一,方法2不拋出任何異常下:方法1先創(chuàng)建事務(wù),但是方法2也要運(yùn)行在自己的事務(wù)中,因此也會(huì)創(chuàng)建一個(gè)事務(wù),方法1的事務(wù)將會(huì)掛起,直到方法2的事務(wù)執(zhí)行完成才會(huì)接著事務(wù)的提交完成

情況二,方法2拋出運(yùn)行時(shí)異常下: 對(duì)于REQUIRES_NEW事務(wù)傳播機(jī)制,如果被調(diào)用端(方法2)拋出運(yùn)行時(shí)異常,則被調(diào)用端事務(wù)回滾,如果調(diào)用段代碼(方法1)捕獲了被調(diào)用端拋出的運(yùn)行時(shí)異常,那么調(diào)用端事務(wù)提交,不回滾。反之,如果調(diào)用段代碼未捕獲被調(diào)用端拋出的運(yùn)行時(shí)異常,那么調(diào)用端事務(wù)回滾,不提交。

@6、方法1的事務(wù)傳播機(jī)制為REQUIRED,方法2的事務(wù)傳播機(jī)制為SUPPORTS,方法1創(chuàng)建一個(gè)事務(wù),方法2加入到當(dāng)前事務(wù)中,方法2拋出運(yùn)行異常將進(jìn)行事務(wù)的回滾,如果方法1不具有事務(wù),由于方法2的特性是事務(wù)環(huán)境可有可無(wú),方法2也不會(huì)運(yùn)行在事務(wù)中,所以也不會(huì)進(jìn)行回滾。如果方法2拋出的是受檢查異常,異常將會(huì)忽略,事務(wù)將會(huì)提交,當(dāng)然還有別的情況沒(méi)有一一驗(yàn)證

@7、方法1的事務(wù)傳播機(jī)制為REQUIRED,方法2的事務(wù)傳播機(jī)制為NOT_SUPPORTED,由于方法2事務(wù)特性,方法1的事務(wù)將會(huì)被掛起,方法2拋出運(yùn)行時(shí)異常,但是方法2是不在事務(wù)環(huán)境中運(yùn)行的,所以回滾不了,而方法1中未捕獲此異常,將進(jìn)行事務(wù)回滾,如果方法2拋出的是運(yùn)行異常,即使方法1沒(méi)有捕獲此異常,也將被忽略,不進(jìn)行事務(wù)的回滾。

PS:以上都是對(duì)粗粒度的方法的事務(wù)操作,都是在數(shù)據(jù)無(wú)問(wèn)題,特意拋出異常的情況下來(lái)判斷事務(wù)的特性,并在什么情況下事務(wù)將會(huì)起作用。而且spring的事務(wù),在服務(wù)類(lèi)內(nèi)部的方法間調(diào)用,有可能存在被調(diào)用方法配置的事務(wù)不起作用,調(diào)用方在加上事務(wù)就起作用了。還值得測(cè)試深究

九、spring聲明式事務(wù)配置的幾種方式

1、基于@Transactional注解(推薦配置)

<!-- 事務(wù)管理器,對(duì)mybatis操作數(shù)據(jù)庫(kù)進(jìn)行事務(wù)控制,spring使用jdbc的事務(wù)控制類(lèi) -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSourceSuport"></property>
</bean>
<!—開(kāi)啟spring 事務(wù)注解支持 mode="aspectj"表示采用切面 mode="proxy"表示代理模式(默認(rèn)) -->
 <tx:annotation-driven transaction-manager="transactionManager" /> 

MyBatis自動(dòng)參與到spring事務(wù)管理中,無(wú)需額外配置,只要org.mybatis.spring.SqlSessionFactoryBean引用的數(shù)據(jù)源與DataSourceTransactionManager引用的數(shù)據(jù)源一致即可,否則事務(wù)管理會(huì)不起作用。

@Transactional可以作用于接口、接口方法、類(lèi)以及類(lèi)方法上。當(dāng)作用于類(lèi)上時(shí),該類(lèi)的所有 public 方法將都具有該類(lèi)型的事務(wù)屬性,同時(shí),我們也可以在方法級(jí)別使用該標(biāo)注來(lái)覆蓋類(lèi)級(jí)別的定義。 雖然@Transactional 注解可以作用于接口、接口方法、類(lèi)以及類(lèi)方法上,但是 Spring 建議不要在接口或者接口方法上使用該注解,因?yàn)檫@只有在使用基于接口的代理時(shí)它才會(huì)生效。另外,@Transactional 注解應(yīng)該只被應(yīng)用到public 方法上,這是由 Spring AOP 的本質(zhì)決定的。如果你在 protected、private 或者默認(rèn)可見(jiàn)性的方法上使用@Transactional 注解,這將被忽略,也不會(huì)拋出任何異常。默認(rèn)情況下,只有來(lái)自外部的方法調(diào)用才會(huì)被AOP代理捕獲,也就是,類(lèi)內(nèi)部方法調(diào)用本類(lèi)內(nèi)部的其他方法并不會(huì)引起事務(wù)行為,即使被調(diào)用方法使用@Transactional注解進(jìn)行修飾。

2、基于<tx>與<aop>切面的方式進(jìn)行事務(wù)配置

<!-- 事務(wù)管理器,對(duì)mybatis操作數(shù)據(jù)庫(kù)進(jìn)行事務(wù)控制,spring使用jdbc的事務(wù)控制類(lèi) -->
 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
 <property name="dataSource" ref="dataSourceSuport"></property>
 </bean>
 
 <!-- spring 事務(wù)注解 mode="aspectj"表示采用切面 mode="proxy"表示代理模式(默認(rèn)) -->
 <tx:annotation-driven transaction-manager="transactionManager" /> 
 <!-- 通知 映射到上面的事務(wù)管理器-->
 <tx:advice id="txAdive"transaction-manager="transactionManager">
 <tx:attributes>
  <!--name什么方法名稱(chēng)開(kāi)頭 傳播行為 REQUIRED必須事務(wù) rollback-for什么異常類(lèi)進(jìn)行回滾,逗號(hào)隔開(kāi) -->
  <tx:method name="save*" propagation="REQUIRED"rollback-for="java.lang.DaoException"/>
  <tx:method name="delete*" propagation="REQUIRED"rollback-for="java.lang.DaoException"/>
  <tx:method name="insert*" propagation="REQUIRED"rollback-for="java.lang.DaoException"/>
  <tx:method name="update*" propagation="REQUIRED"rollback-for="java.lang.DaoException"/>
  <!-- 不是必須的,而且查詢(xún)類(lèi)型為事務(wù)只讀的可以提高數(shù)據(jù)庫(kù)性能優(yōu)化 -->
  <tx:method name="find*" propagation="SUPPORTS"read-only="true"/>
  <tx:method name="get*" propagation="SUPPORTS"read-only="true"/>
  <tx:method name="select*" propagation="SUPPORTS"read-only="true"/>
 </tx:attributes>
 </tx:advice>
 <!-- aop切面并配置切入點(diǎn)入進(jìn)行事物管理 指向上面的映射 -->
 <aop:config>
 <aop:pointcut expression="execution(* com.zht.service.serviceImpl.*.*(..))"id="txPointcut"/>
 <aop:advisor advice-ref="txAdive" pointcut-ref="txPointcut"/>
 </aop:config>
 <aop:aspectj-autoproxy proxy-target-class="true"/>

3、基于TransactionProxyFactoryBean (bean工廠代理)--需要顯示的為每一個(gè)業(yè)務(wù)類(lèi)配置,每多一個(gè)業(yè)務(wù)類(lèi)就要進(jìn)行添加,這里不在描述。

4、基于TransactionInterceptor(事務(wù)攔截器)的方式進(jìn)行配置。

<bean id="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<propertyname="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<!--事務(wù)攔截器,激活事務(wù)管理器所必須的bean -->
<bean id="transactionInterceptor"class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<!--配置事務(wù)屬性 -->
<property name="transactionAttributes">
<props>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<!--定義事務(wù)處理代理bean,他需要兩個(gè)屬性,一個(gè)是指定需要代理的bean,另一個(gè)是代理bean所需的事務(wù)攔截器 -->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>tempService</value>
</list>
</property>
<propertyname="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean>
<!--業(yè)務(wù)邏輯層 -->
<bean id="tempService" class="com.cj.transaction.service.TempService"abstract="false"
 
lazy-init="default"autowire="default" dependency-check="default">
<property name="userDAO">
<ref bean="userDAO" />
</property>
<property name="deptDAO">
<ref bean="deptDAO" />
</property>
</bean>
<bean id="userDAO" class="com.cj.transaction.hibernate.UserDAO">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="deptDAO"class="com.cj.transaction.hibernate.DeptDAO">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>

如果模塊過(guò)多話(huà),可以考慮根據(jù)bean的名稱(chēng)用自動(dòng)創(chuàng)建事務(wù)代理的方式

<!--自動(dòng)代理 -->
<bean id="autoproxy"class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>*Service</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean>

PS:以上為自己收集以及在spring+springMVC+mybatis框架測(cè)試總結(jié)的一些內(nèi)容,特記錄下,如果有理解錯(cuò)的地方望拍磚指出,感激不盡。希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。。

相關(guān)文章

最新評(píng)論