關(guān)于spring事務(wù)傳播行為非事務(wù)方式的理解
spring事務(wù)傳播行為非事務(wù)方式
具體的隔離級別可以看看搜一下,相關(guān)的博客挺多的,現(xiàn)在說一下對傳播行為 PROPAGATION_NOT_SUPPORTED、PROPAGATION_NEVER中很多解釋為 非事務(wù)方式運(yùn)行 的理解。 ??
關(guān)于什么是‘非事務(wù)方式運(yùn)行‘問了些人,也看了spring相關(guān)解釋,都沒能解釋的讓人很明白。從字面上解釋就是不在事務(wù)中運(yùn)行,這種理解是不對的。在innodb這種支持事務(wù)的存儲引擎中,所有的操作都是在事務(wù)中完成的。
下面截圖是默認(rèn)隔離級別(PROPAGATION_REQUIRED)下數(shù)據(jù)庫操作的截圖,在進(jìn)行插入之前都會設(shè)置為非自動提交。
??
下圖是never隔離級別下的數(shù)據(jù)庫操作截圖,可以看到在操作數(shù)據(jù)庫之前設(shè)置為自動提交了。
??
demo代碼如下,ps:傳播行為、隔離級別生效 要在不同的類中調(diào)用(動態(tài)代理支持)
??
小結(jié)一下:非事務(wù)的方式運(yùn)行,其實(shí)就是設(shè)置為自動提交了,如果一個(gè)方法中有多個(gè)操作,則每個(gè)操作都會在不同事務(wù)中完成,不會保證他們的原子性。個(gè)人理解,有啥不對 歡迎指正。
Spring事務(wù)理解和配置
1 Spring事務(wù)
1.1 事務(wù)簡介
1.1.1 什么是事務(wù)
- 事務(wù):邏輯上的一組操作,組成這組操作的各個(gè)單元,要么全部成功,要么全部失敗.
1.1.2 事物的特性
- 原子性:事務(wù)不可分割
- 一致性:事務(wù)執(zhí)行前后數(shù)據(jù)完整性保持一致
- 隔離性:一個(gè)事務(wù)的執(zhí)行不應(yīng)該受到其他事物的影響
- 持久性:一旦事務(wù)結(jié)束,數(shù)據(jù)就持久化到數(shù)據(jù)庫
1.1.3 不考慮事物會引發(fā)的安全問題
- 讀問題
臟讀:一個(gè)事務(wù)讀到另一個(gè)事務(wù)未提交的數(shù)據(jù)
不可重復(fù)度:一個(gè)事務(wù)讀到另一個(gè)事務(wù)已經(jīng)提交的update的數(shù)據(jù),導(dǎo)致一個(gè)事務(wù)中多次查詢結(jié)果不一致.
幻讀:一個(gè)事務(wù)讀到另一個(gè)事務(wù)已經(jīng)提交的insert的數(shù)據(jù),導(dǎo)致一個(gè)事務(wù)中多次查詢結(jié)果不一致
- 寫問題
丟失更新
1.1.4 事務(wù)隔離級別
Read uncommitted
:讀未提交,任何問題解決不了Read committed
:讀已提交,解決臟讀,但是不可重復(fù)度和幻讀有可能發(fā)生(Oracle默認(rèn))Repeatable read
:重復(fù)度,解決臟讀和不可重復(fù)讀,但是幻讀可能發(fā)生(msyql默認(rèn))Serializable
:序列化,解決所有讀問題
1.2 事務(wù)的傳播行為
Spring中提供了七種事務(wù)的傳播行為:
保證多個(gè)操作在同一個(gè)事務(wù)中
PROPAGATION_REQUIRED
:默認(rèn)值,如果A中有事務(wù),使用A中的事務(wù),如果A沒有,創(chuàng)建一個(gè)新的事務(wù),將操作包含進(jìn)來PROPAGATION_SUPPORTS
:支持事務(wù),如果A中有事務(wù),使用A中的事務(wù)。如果A沒有事務(wù),不使用事務(wù)。PROPAGATION_MANDATORY
:如果A中有事務(wù),使用A中的事務(wù)。如果A沒有事務(wù),拋出異常。
保證多個(gè)操作不在同一個(gè)事務(wù)中
PROPAGATION_REQUIRES_NEW
:如果A中有事務(wù),將A的事務(wù)掛起(暫停),創(chuàng)建新事務(wù),只包含自身操作。如果A中沒有事務(wù),創(chuàng)建一個(gè)新事務(wù),包含自身操作。PROPAGATION_NOT_SUPPORTED
:如果A中有事務(wù),將A的事務(wù)掛起。不使用事務(wù)管理。PROPAGATION_NEVER
:如果A中有事務(wù),報(bào)異常。
嵌套式事務(wù)
PROPAGATION_NESTED
:嵌套事務(wù),如果A中有事務(wù),按照A的事務(wù)執(zhí)行,執(zhí)行完成后,設(shè)置一個(gè)保存點(diǎn),執(zhí)行B中的操作,如果沒有異常,執(zhí)行通過,如果有異常,可以選擇回滾到最初始位置,也可以回滾到保存點(diǎn)。
1.3 編程式事務(wù)(需要手動寫代碼,了解)
1.3.1 配置平臺事務(wù)管理器
<!-- 配置平臺事務(wù)管理器============================= --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
1.3.2 Spring提供了事務(wù)管理的模板類
<!-- 配置事務(wù)管理的模板 --> <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> <property name="transactionManager" ref="transactionManager"/> </bean>
1.3.3 在業(yè)務(wù)層注入事務(wù)管理的模板
<!-- 配置Service============= --> <bean id="accountService" class="com.itheima.tx.demo1.AccountServiceImpl"> <property name="accountDao" ref="accountDao"/> <!-- 注入 事務(wù)管理的模板 --> <property name="trsactionTemplate" ref="transactionTemplate"/> </bean>
1.3.4 編寫事務(wù)管理的代碼
public void transfer(final String from, final String to, final Double money) { trsactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) { accountDao.outMoney(from, money); int d = 1/0; accountDao.inMoney(to, money); } });
1.4 聲明式事務(wù)(xml配置)
1.4.1 配置事務(wù)管理器
<!-- 配置事務(wù)管理器=============================== --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
1.4.2 配置增強(qiáng)
<!-- 配置事務(wù)的增強(qiáng)=============================== --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- 事務(wù)管理的規(guī)則 --> <!-- <tx:method name="save*" propagation="REQUIRED" isolation="DEFAULT"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="delete*" propagation="REQUIRED"/> <tx:method name="find*" read-only="true"/> --> <tx:method name="*" propagation="REQUIRED" read-only="false"/> </tx:attributes> </tx:advice>
1.4.3 AOP的配置
<!-- aop的配置 --> <aop:config> <aop:pointcut expression="execution(* com.itheima.tx.demo2.AccountServiceImpl.*(..))" id="pointcut1"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/> </aop:config>
1.5 聲明式事務(wù)(注解)
1.5.1 配置事務(wù)管理器
<!-- 配置事務(wù)管理器=============================== --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
1.5.2 開啟注解事務(wù)
<!-- 開啟注解事務(wù)================================ --> <tx:annotation-driven transaction-manager="transactionManager"/>
1.5.3 在業(yè)務(wù)層添加注解
@Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED) public class AccountServiceImpl implements AccountService {
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解springboot和vue前后端分離開發(fā)跨域登陸問題
這篇文章主要介紹了詳解springboot和vue前后端分離開發(fā)跨域登陸問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09Java使用PrepareStatement實(shí)現(xiàn)數(shù)據(jù)的插入與查詢操作
這篇文章主要為大家詳細(xì)介紹了Java如何使用PrepareStatement實(shí)現(xiàn)數(shù)據(jù)的插入與查詢操作,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-09-09spring security中的csrf防御原理(跨域請求偽造)
這篇文章主要介紹了spring security中的csrf防御機(jī)制原理解析(跨域請求偽造),本文通過實(shí)例代碼詳解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12mybatis參數(shù)String與Integer類型的判斷方式
這篇文章主要介紹了mybatis參數(shù)String與Integer類型的判斷方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03java?mybatis如何操作postgresql?array數(shù)組類型
這篇文章主要介紹了java?mybatis如何操作postgresql?array數(shù)組類型,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01Spring?cloud?實(shí)現(xiàn)房源查詢功能的實(shí)例代碼
這篇文章主要介紹了Spring?cloud?實(shí)現(xiàn)房源查詢功能,本項(xiàng)目是一個(gè)多模塊項(xiàng)目,創(chuàng)建一個(gè) Spring Initializr 項(xiàng)目 不自動添加依賴項(xiàng),完成創(chuàng)建后刪除自帶的src目錄,并在根目錄下創(chuàng)建新的maven模塊,需要的朋友可以參考下2022-09-09