Spring中的事務(wù)管理及實(shí)現(xiàn)方式解析
1、事務(wù)認(rèn)識(shí)
大家所了解的事務(wù)Transaction,它是一些列嚴(yán)密操作動(dòng)作,要么都操作完成,要么都回滾撤銷。
Spring事務(wù)管理基于底層數(shù)據(jù)庫本身的事務(wù)處理機(jī)制。
數(shù)據(jù)庫事務(wù)的基礎(chǔ),是掌握Spring事務(wù)管理的基礎(chǔ)。
事務(wù)具備ACID四種特性,ACID是Atomic(原子性)、Consistency(一致性)、Isolation(隔離性)和Durability(持久性)的英文縮寫。
- A:原子性(Atomicity),一個(gè)事務(wù)(transaction)中的所有操作,要么全部完成,要么全部不完成,不會(huì)結(jié)束在中間某個(gè)環(huán)節(jié)。事務(wù)在執(zhí)行過程中發(fā)生錯(cuò)誤,會(huì)被回滾(Rollback)到事務(wù)開始前的狀態(tài),就像這個(gè)事務(wù)從來沒有執(zhí)行過一樣。就像你買東西要么交錢收貨一起都執(zhí)行,要么發(fā)不出貨,就退錢。
- C:一致性(Consistency),事務(wù)的一致性指的是在一個(gè)事務(wù)執(zhí)行之前和執(zhí)行之后數(shù)據(jù)庫都必須處于一致性狀態(tài)。如果事務(wù)成功地完成,那么系統(tǒng)中所有變化將正確地應(yīng)用,系統(tǒng)處于有效狀態(tài)。如果在事務(wù)中出現(xiàn)錯(cuò)誤,那么系統(tǒng)中的所有變化將自動(dòng)地回滾,系統(tǒng)返回到原始狀態(tài)。
- I:隔離性(Isolation),指的是在并發(fā)環(huán)境中,當(dāng)不同的事務(wù)同時(shí)操縱相同的數(shù)據(jù)時(shí),每個(gè)事務(wù)都有各自的完整數(shù)據(jù)空間。由并發(fā)事務(wù)所做的修改必須與任何其他并發(fā)事務(wù)所做的修改隔離。事務(wù)查看數(shù)據(jù)更新時(shí),數(shù)據(jù)所處的狀態(tài)要么是另一事務(wù)修改它之前的狀態(tài),要么是另一事務(wù)修改它之后的狀態(tài),事務(wù)不會(huì)查看到中間狀態(tài)的數(shù)據(jù)。打個(gè)比方,你買東西這個(gè)事情,是不影響其他人的。
- D:持久性(Durability),指的是只要事務(wù)成功結(jié)束,它對(duì)數(shù)據(jù)庫所做的更新就必須***保存下來。即使發(fā)生系統(tǒng)崩潰,重新啟動(dòng)數(shù)據(jù)庫系統(tǒng)后,數(shù)據(jù)庫還能恢復(fù)到事務(wù)成功結(jié)束時(shí)的狀態(tài)。打個(gè)比方,你買東西的時(shí)候需要記錄在賬本上,即使老板忘記了那也有據(jù)可查。
2、事務(wù)的傳播特性
事務(wù)傳播行為就是多個(gè)事務(wù)方法調(diào)用時(shí),如何定義方法間事務(wù)的傳播。
Spring定義了7中傳播行為:
(1)propagation_requierd:如果當(dāng)前沒有事務(wù),就新建一個(gè)事務(wù),如果已存在一個(gè)事務(wù)中,加入到這個(gè)事務(wù)中,這是Spring默認(rèn)的選擇。
(2)propagation_supports:支持當(dāng)前事務(wù),如果沒有當(dāng)前事務(wù),就以非事務(wù)方法執(zhí)行。
(3)propagation_mandatory:使用當(dāng)前事務(wù),如果沒有當(dāng)前事務(wù),就拋出異常。
(4)propagation_required_new:新建事務(wù),如果當(dāng)前存在事務(wù),把當(dāng)前事務(wù)掛起。
(5)propagation_not_supported:以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),就把當(dāng)前事務(wù)掛起。
(6)propagation_never:以非事務(wù)方式執(zhí)行操作,如果當(dāng)前事務(wù)存在則拋出異常。
(7)propagation_nested:如果當(dāng)前存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行。如果當(dāng)前沒有事務(wù),則執(zhí)行與propagation_required類似的操作。
3、事務(wù)的隔離級(jí)別
(1)read uncommited:是最低的事務(wù)隔離級(jí)別,它允許另外一個(gè)事務(wù)可以看到這個(gè)事務(wù)未提交的數(shù)據(jù)。
(2)read commited:保證一個(gè)事物提交后才能被另外一個(gè)事務(wù)讀取。另外一個(gè)事務(wù)不能讀取該事物未提交的數(shù)據(jù)。
(3)repeatable read:這種事務(wù)隔離級(jí)別可以防止臟讀,不可重復(fù)讀。但是可能會(huì)出現(xiàn)幻象讀。它除了保證一個(gè)事務(wù)不能被另外一個(gè)事務(wù)讀取未提交的數(shù)據(jù)之外還避免了以下情況產(chǎn)生(不可重復(fù)讀)。
(4)serializable:這是花費(fèi)最高代價(jià)但最可靠的事務(wù)隔離級(jí)別。事務(wù)被處理為順序執(zhí)行。除了防止臟讀,不可重復(fù)讀之外,還避免了幻象讀
臟讀、不可重復(fù)讀、幻象讀概念說明:
a. 臟讀:指當(dāng)一個(gè)事務(wù)正字訪問數(shù)據(jù),并且對(duì)數(shù)據(jù)進(jìn)行了修改,而這種數(shù)據(jù)還沒有提交到數(shù)據(jù)庫中,這時(shí),另外一個(gè)事務(wù)也訪問這個(gè)數(shù)據(jù),然后使用了這個(gè)數(shù)據(jù)。因?yàn)檫@個(gè)數(shù)據(jù)還沒有提交那么另外一個(gè)事務(wù)讀取到的這個(gè)數(shù)據(jù)我們稱之為臟數(shù)據(jù)。依據(jù)臟數(shù)據(jù)所做的操作肯能是不正確的。
b. 不可重復(fù)讀:指在一個(gè)事務(wù)內(nèi),多次讀同一數(shù)據(jù)。在這個(gè)事務(wù)還沒有執(zhí)行結(jié)束,另外一個(gè)事務(wù)也訪問該同一數(shù)據(jù),那么在第一個(gè)事務(wù)中的兩次讀取數(shù)據(jù)之間,由于第二個(gè)事務(wù)的修改第一個(gè)事務(wù)兩次讀到的數(shù)據(jù)可能是不一樣的,這樣就發(fā)生了在一個(gè)事物內(nèi)兩次連續(xù)讀到的數(shù)據(jù)是不一樣的,這種情況被稱為是不可重復(fù)讀。
c. 幻象讀:一個(gè)事務(wù)先后讀取一個(gè)范圍的記錄,但兩次讀取的紀(jì)錄數(shù)不同,我們稱之為幻象讀(兩次執(zhí)行同一條 select 語句會(huì)出現(xiàn)不同的結(jié)果,第二次讀會(huì)增加一數(shù)據(jù)行,并沒有說這兩次執(zhí)行是在同一個(gè)事務(wù)中)
4、事務(wù)幾種實(shí)現(xiàn)方式(兩種方式)
編程式事務(wù)管理(目前在開發(fā)中很少使用)
使用步驟
1. 配置數(shù)據(jù)庫事務(wù)管理 DataSourceTransactionManager
<!--配置事務(wù)管理器--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
2. 配置數(shù)據(jù)庫事務(wù)管理模板
<!--配置事務(wù)管理模板--> <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> <!--配置事務(wù)管理--> <property name="transactionManager" ref="transactionManager"></property> </bean>
3. 在Service層中注入數(shù)據(jù)庫事務(wù)管理模板
<!--配置Service--> <bean id="accountService" class="top.wintp.springtx.demo1.service.AccountServiceImpl"> <!--配置事務(wù)的管理模板類--> <property name="transactionTemplate" ref="transactionTemplate"/> <property name="accountDao" ref="accountDao"/> </bean>
4. 在需要執(zhí)行事務(wù)的位置調(diào)用transactionTemplate的execute()方法
transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) { //執(zhí)行你的邏輯 } });
聲明式事務(wù)管理
聲明式事務(wù)管理方式一:基于TransactionProxyFactoryBean的方式 (不常用)
使用步驟
1.配置事務(wù)管理 DataResourceTransactionManager
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
2.配置事務(wù)代理類
<!--配置事務(wù)代理類--> <bean id="accountServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <!--配置事務(wù)管理器--> <property name="transactionManager" ref="transactionManager"/> <!--配置代理目標(biāo)類--> <property name="target" ref="accountService"></property> <!-- 配置事物的基本屬性 必須配置 --> <property name="transactionAttributes"> <props> <!-- prop 格式 key:方法名 或者 方法 * 例如 insert* 值的格式: PROPAGATION:事物的傳播行為 ISOLATION:事物的隔離級(jí)別 readOnly:只讀 -Exception:發(fā)生哪些異常,回滾事物 默認(rèn)任何異常都回滾 +Exception:發(fā)生哪些異常,不回滾事物 --> <prop key="transfMoney">PROPAGATION_REQUIRED</prop> </props> </property> </bean>
3.引用代理類 使用代理目標(biāo)類來接收
@Resource(name = "accountServiceProxy") private AccountService mAccountService;
聲明式事務(wù)管理方式二:基于AspectJ的XML方式
1.配置事務(wù)管理類
<!--配置事務(wù)的管理類--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
2.配置事務(wù)的增強(qiáng)
<!--配置事務(wù)的增強(qiáng)--> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*" propagation="REQUIRED"/> </tx:attributes> </tx:advice>
3.配置AOP – 切點(diǎn)和切面
<!--配置AOP--> <aop:config> <!--配置切入點(diǎn)--> <aop:pointcut id="pointcut1" expression="execution(* top.wintp.springtx.demo6.service.AccountService+.*(..))"/> <!--配置切面--> <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/> </aop:config>
聲明式事務(wù)管理方式三:基于注解的方式(常用)
1.配置事務(wù)管理器
<!--配置事務(wù)的管理類--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
2.開啟事務(wù)注解
<!--開啟事務(wù)注解 --> <tx:annotation-driven transaction-manager="transactionManager"/>
3.在需要事物管理的類上添加注解
@Transactional(propagation = Propagation.REQUIRED)
到此這篇關(guān)于Spring中的事務(wù)管理及實(shí)現(xiàn)方式解析的文章就介紹到這了,更多相關(guān)Spring事務(wù)管理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java并發(fā)編程之柵欄(CyclicBarrier)實(shí)例介紹
這篇文章主要介紹了Java并發(fā)編程之柵欄(CyclicBarrier)實(shí)例介紹,柵欄類似閉鎖,但是它們是有區(qū)別的,需要的朋友可以參考下2015-04-04Json轉(zhuǎn)list二層解析轉(zhuǎn)換代碼實(shí)例
這篇文章主要介紹了Json轉(zhuǎn)list二層解析轉(zhuǎn)換代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12logback ThrowableProxyConverter類源碼流程解析
這篇文章主要為大家介紹了logback ThrowableProxyConverter類源碼流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12Java實(shí)現(xiàn)用戶短信驗(yàn)證碼登錄功能實(shí)例代碼
現(xiàn)在不管是各類的網(wǎng)站,還是大小社交app,登錄方式是越來越多了,但是大部分還是以短信登錄為主,本文主要介紹了java短信驗(yàn)證碼登錄功能設(shè)計(jì)與實(shí)現(xiàn),感興趣的可以了解一下2021-11-11Java中如何對(duì)字符串進(jìn)行utf-8編碼
這篇文章主要介紹了Java中如何對(duì)字符串進(jìn)行utf-8編碼問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04SpringBoot整合Hbase的實(shí)現(xiàn)示例
這篇文章主要介紹了SpringBoot整合Hbase的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Java中的CyclicBarrier循環(huán)柵欄深入解析
這篇文章主要介紹了Java中的CyclicBarrier循環(huán)柵欄深入解析,CycleBarrier 它就相當(dāng)于是一個(gè)柵欄,所有線程在到達(dá)柵欄后都需要等待其他線程,等所有線程都到達(dá)后,再一起通過,需要的朋友可以參考下2023-12-12簡(jiǎn)單講解Java的Socket網(wǎng)絡(luò)編程的多播與廣播實(shí)現(xiàn)
這篇文章主要介紹了Java的Socket網(wǎng)絡(luò)編程的多播與廣播實(shí)現(xiàn),包括網(wǎng)絡(luò)編程發(fā)送和接受數(shù)據(jù)的一些基礎(chǔ)知識(shí)整理,需要的朋友可以參考下2016-01-01Java請(qǐng)求流量合并和拆分提高系統(tǒng)的并發(fā)量示例
這篇文章主要為大家介紹了Java請(qǐng)求流量合并和拆分提高系統(tǒng)的并發(fā)量示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04Java實(shí)現(xiàn)一個(gè)達(dá)達(dá)租車系統(tǒng)的步驟詳解
這篇文章主要給大家介紹了利用Java實(shí)現(xiàn)一個(gè)達(dá)達(dá)租車系統(tǒng)的步驟,文中給出了詳細(xì)的實(shí)現(xiàn)思路和示例代碼,并在文末給出了完整的源碼供大家學(xué)習(xí)下載,需要的朋友可以參考借鑒,下面來一起看看吧。2017-04-04