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

