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

