spring手动回滚事务_Spring总结---gt;03
什么是事務(wù)
邏輯上的一組操作,組成這組操作的各個(gè)單元,要么全都成功,要么全都失敗。事務(wù)的特性
原子性:事務(wù)不可分割一致性:事務(wù)執(zhí)行前后數(shù)據(jù)完整性保持一致隔離性:一個(gè)事務(wù)的執(zhí)行不應(yīng)該受到其他事務(wù)的干擾 持久性:一旦事務(wù)結(jié)束,數(shù)據(jù)就持久化到數(shù)據(jù)庫(kù)環(huán)境搭配
1、導(dǎo)入jar包。mysql-connector-java-5.1.30spring-tx-4.1.6.RELEASEspring-jdbc-4.1.6.RELEASEcom.springsource.com.mchange.v2.c3p0-0.9.1.2 2、添加Spring的配置文件。 3、將要連接數(shù)據(jù)庫(kù)的屬性封裝到文件中。 4、創(chuàng)建業(yè)務(wù)層接口和實(shí)現(xiàn)類。 5、創(chuàng)建DAO層接口和實(shí)現(xiàn)類,如果要使用Spring的jdbc模板,需要用實(shí)現(xiàn)類去繼承jdbcDaoSupport。這樣獲得了jdbc操作數(shù)據(jù)庫(kù)的模板。步驟3如果不添加jdbc
找不到Connection連接對(duì)象繼承jdbcDaoSupport接下來(lái)在方法中,我們可以通過(guò)使用this關(guān)鍵字來(lái)調(diào)用Jdbc的模板,該圖為jdbcDaoSupport的源碼中封裝的
通過(guò)使用this關(guān)鍵字調(diào)用this.getjdbcTemplate()方法,調(diào)用update進(jìn)行DML操作。 注意:update方法中有一個(gè)重載方法支持可變參數(shù),所以可以傳遞多個(gè)參數(shù)。傳入sql語(yǔ)句,以及可變參數(shù)6、創(chuàng)建業(yè)務(wù)層接口。 7、創(chuàng)建業(yè)務(wù)層接口實(shí)現(xiàn)類。 8、在原有的AspectJ的applicationContext.xml文件進(jìn)行修該。8.1、添加約束頭信息xmlns:context="http://www.springframework.org/schema/context" http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd8.2、加載jdbc屬性文件。8.3、注冊(cè)c3p0數(shù)據(jù)源,用于獲取數(shù)據(jù)庫(kù)連接屬性的值。8.4、獲取兩個(gè)業(yè)務(wù)層實(shí)現(xiàn)類,子標(biāo)簽引用地址為數(shù)據(jù)源。約束頭取值事務(wù)管理
在程序運(yùn)行中,可能會(huì)發(fā)生異常,那么需要將事務(wù)進(jìn)行回滾。而事務(wù)回滾一般是在持久層進(jìn)行的,為了方便統(tǒng)一,將事務(wù)的管理 在業(yè)務(wù)層中。 事務(wù)回滾有兩種方式,一種AspectJ的AOP配置管理事務(wù),一種是事務(wù)注解管理事務(wù)。AOP配置管理事務(wù)
目前是測(cè)試階段,手動(dòng)添加一個(gè)異常類,方便用于測(cè)試。 1、在applicationContext.xml文件中添加注冊(cè)事務(wù)管理標(biāo)簽。 2、注冊(cè)事務(wù)通知,使用tx標(biāo)簽,引入tx標(biāo)簽的約束頭信息。http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdxmlns:tx="http://www.springframework.org/schema/tx"class="DataSourceTransactionManager的全限定類名,這個(gè)應(yīng)用在jdbc或myBatis進(jìn)行持久化數(shù)據(jù)時(shí)使用"其中,tx標(biāo)簽中的屬性值為,
<tx:advice id="名字" transaction-manager="注冊(cè)過(guò)的事務(wù)管理器">
<tx:attributes> 這個(gè)標(biāo)簽的作用是配置事務(wù)屬性
tx:method name="將事務(wù)添加到哪個(gè)方法上*" isolation="事務(wù)的隔離級(jí)別,默認(rèn)default" propagation="事務(wù)的行為" read-only="只讀false或者true" rollback-for="對(duì)哪個(gè)異常進(jìn)行回滾"no-rollback-for="對(duì)哪個(gè)異常不進(jìn)行回滾"timeout="超時(shí)時(shí)限,單位是秒"/>
有的屬性沒(méi)寫(xiě),可以自行參照測(cè)試。3、AOP配置,使用AOP的aop:config標(biāo)簽。業(yè)務(wù)層中的異常類的應(yīng)用,經(jīng)創(chuàng)建測(cè)試類后,通過(guò)獲取bean,調(diào)用相關(guān)方法進(jìn)行測(cè)試,事務(wù)的回滾成功
聲明式事務(wù)
1、編程式事務(wù):
1.1 由程序員編程事務(wù)控制代碼。
1.2 OpenSessionInView 編程式事務(wù)。
2.聲明式事務(wù):
2.1 事務(wù)控制代碼已經(jīng)由 spring 寫(xiě)好.程序員只需要聲明出哪些方法需要進(jìn)行事務(wù)控制和如何進(jìn)行事務(wù)控制。
3.聲明式事務(wù)都是針對(duì)于 ServiceImpl 類下方法的。
4.事務(wù)管理器基于通知(advice)的。
5.在 spring 配置文件中配置聲明式事務(wù)。
聲明式事務(wù)中屬性解釋
1. name=”” 哪些方法需要有事務(wù)控制
1.1 支持*通配符
2. readonly=”boolean” 是否是只讀事務(wù).
2.1 如果為 true,告訴數(shù)據(jù)庫(kù)此事務(wù)為只讀事務(wù).數(shù)據(jù)化優(yōu)化,會(huì)對(duì)性能有一定提升,所以只要是查詢的方法,建議使用此數(shù)據(jù).
2.2 如果為 false(默認(rèn)值),事務(wù)需要提交的事務(wù).建議新增,刪除,修改.
3. propagation 控制事務(wù)傳播行為.
3.1 當(dāng)一個(gè)具有事務(wù)控制的方法被另一個(gè)有事務(wù)控制的方法調(diào)用后,需要如何管理事務(wù)(新建事務(wù)?在事務(wù)中執(zhí)行?把事務(wù)掛起?報(bào)異常?)
3.2 REQUIRED(默認(rèn)值): 如果當(dāng)前有事務(wù),就在事務(wù)中執(zhí)行,如果當(dāng)前沒(méi)有事務(wù),新建一個(gè)事務(wù).
3.3 SUPPORTS: 如果當(dāng)前有事務(wù)就在事務(wù)中執(zhí)行,如果當(dāng)前沒(méi)有事務(wù),就在非事務(wù)狀態(tài)下執(zhí)行.
3.4 MANDATORY: 必須在事務(wù)內(nèi)部執(zhí)行,如果當(dāng)前有事務(wù),就在事務(wù)中執(zhí)行,如果沒(méi)有事務(wù),報(bào)錯(cuò).
3.5 REQUIRES_NEW: 必須在事務(wù)中執(zhí)行,如果當(dāng)前沒(méi)有事務(wù),新建事務(wù),如果當(dāng)前有事務(wù),把當(dāng)前事務(wù)掛起.
3.6 NOT_SUPPORTED: 必須在非事務(wù)下執(zhí)行,如果當(dāng)前沒(méi)有事務(wù),正常執(zhí)行,如果當(dāng)前有事務(wù),把當(dāng)前事務(wù)掛起.
3.7 NEVER: 必須在非事務(wù)狀態(tài)下執(zhí)行,如果當(dāng)前沒(méi)有事務(wù),正常執(zhí)行,如果當(dāng)前有事務(wù),報(bào)錯(cuò).
3.8 NESTED: 必須在事務(wù)狀態(tài)下執(zhí)行.如果沒(méi)有事務(wù),新建事務(wù),如果當(dāng)前有事務(wù),創(chuàng)建一個(gè)嵌套事務(wù).
4. isolation=”” 事務(wù)隔離級(jí)別
4.1 在多線程或并發(fā)訪問(wèn)下如何保證訪問(wèn)到的數(shù)據(jù)具有完整性的.
4.2 臟讀:
4.2.1 一個(gè)事務(wù)(A)讀取到另一個(gè)事務(wù)(B)中未提交的數(shù)據(jù),另一個(gè)事務(wù)中數(shù)據(jù)可能進(jìn)行了改變,此時(shí)A事務(wù)讀取的數(shù)據(jù)可能和數(shù)據(jù)庫(kù)中數(shù)據(jù)是不一致的,此時(shí)認(rèn)為數(shù)據(jù)是臟數(shù)據(jù),讀取臟數(shù)據(jù)過(guò)程叫做臟讀。
4.3 不可重復(fù)讀:
4.3.1、主要針對(duì)的是某行數(shù)據(jù).(或行中某列)
4.3.2、主要針對(duì)的操作是修改操作.
4.3.3、兩次讀取在同一個(gè)事務(wù)內(nèi)
4.3.4、當(dāng)事務(wù)A第一次讀取事務(wù)后,事務(wù)B對(duì)事務(wù)A讀取的淑君進(jìn)行修改,事務(wù) A 中再次讀取的數(shù)據(jù)和之前讀取的數(shù)據(jù)不一致,過(guò)程不可重復(fù)讀。
4.4 幻讀:
4.4.1、 主要針對(duì)的操作是新增或刪除
4.4.2、 兩次事務(wù)的結(jié)果.
4.4.3、 事務(wù)A按照特定條件查詢出結(jié)果,事務(wù)B新增了一條符合條件的數(shù)據(jù).事務(wù) A 中查詢的數(shù)據(jù)和數(shù)據(jù)庫(kù)中的數(shù)據(jù)不一致的,事務(wù) A 好像出現(xiàn)了幻覺(jué),這種情況稱為幻讀.
4.5DEFAULT: 默認(rèn)值,由底層數(shù)據(jù)庫(kù)自動(dòng)判斷應(yīng)該使用什么隔離界
別
4.6READ_UNCOMMITTED: 可以讀取未提交數(shù)據(jù),可能出現(xiàn)臟讀,不
重復(fù)讀,幻讀.
4.6.1 效率最高.
4.7 READ_COMMITTED:只能讀取其他事務(wù)已提交數(shù)據(jù).可以防止臟讀,可能出現(xiàn)不可重復(fù)讀和幻讀.
4.8 REPEATABLE_READ: 讀取的數(shù)據(jù)被添加鎖,防止其他事務(wù)修改此數(shù)據(jù),可以防止不可重復(fù)讀.臟讀,可能出現(xiàn)幻讀.
4.9 SERIALIZABLE: 排隊(duì)操作,對(duì)整個(gè)表添加鎖.一個(gè)事務(wù)在操作數(shù)據(jù)時(shí),另一個(gè)事務(wù)等待事務(wù)操作完成后才能操作這個(gè)表.
4.9.1 最安全的
4.9.2 效率最低的.
5. rollback-for=”異常類型全限定路徑”
5.1 當(dāng)出現(xiàn)什么異常時(shí)需要進(jìn)行回滾
5.2 建議:給定該屬性值.
5.2.1 手動(dòng)拋異常一定要給該屬性值
6. no-rollback-for=””
6.1 當(dāng)出現(xiàn)什么異常時(shí)不滾回事務(wù).
總結(jié)
以上是生活随笔為你收集整理的spring手动回滚事务_Spring总结---gt;03的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Redis常用数据类型的数据结构
- 下一篇: quartz获取开始结束时间_Sprin