javascript
对Spring事务一些问题的讨论
提起spring事務(wù),就會(huì)讓人聯(lián)想起四大基本特征,五個(gè)隔離級別,七大傳播特性。相信大多數(shù)人都知道這些東西,但是知道是一回事情,能用好真的是另一回事了。在使用Spring事務(wù)的時(shí)候,我曾遇到過幾個(gè)比較嚴(yán)肅的問題,在這里我做一個(gè)自我總結(jié)。
?
問題一、 propagation.NESTED和propagation.REQUIRED_NEW有什么區(qū)別?
當(dāng)調(diào)用方不存在事務(wù)的時(shí)候,兩者的效果是一致的。所以這里討論問題的前提是調(diào)用方存在事務(wù)。PROPAGATION_REQUIRES_NEW 啟動(dòng)一個(gè)新的, 不依賴于環(huán)境的 "內(nèi)部" 事務(wù). 這個(gè)事務(wù)將被完全 commited 或 rolled back 而不依賴于外部事務(wù), 它擁有自己的隔離范圍, 自己的鎖, 等等. 當(dāng)內(nèi)部事務(wù)開始執(zhí)行時(shí), 外部事務(wù)將被掛起, 內(nèi)務(wù)事務(wù)結(jié)束時(shí), 外部事務(wù)將繼續(xù)執(zhí)行.?
另一方面, PROPAGATION_NESTED 開始一個(gè) "嵌套的" 事務(wù), 它是已經(jīng)存在事務(wù)的一個(gè)真正的子事務(wù). 潛套事務(wù)開始執(zhí)行時(shí), 它將取得一個(gè) savepoint. 如果這個(gè)嵌套事務(wù)失敗, 我們將回滾到此 savepoint. 潛套事務(wù)是外部事務(wù)的一部分, 只有外部事務(wù)結(jié)束后它才會(huì)被提交.?
由此可見, PROPAGATION_REQUIRES_NEW 和 PROPAGATION_NESTED 的最大區(qū)別在于, PROPAGATION_REQUIRES_NEW 完全是一個(gè)新的事務(wù), 而 PROPAGATION_NESTED 則是外部事務(wù)的子事務(wù), 如果外部事務(wù) commit, 嵌套事務(wù)也會(huì)被 commit, 這個(gè)規(guī)則同樣適用于 roll back.?
?
問題二、 @Transactional為什么會(huì)失效?
1.調(diào)用方和被調(diào)用方屬于同一個(gè)component,被調(diào)用方的?@Transacational注解無效
package com.transacational;import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional;/*** Created by chenqimiao on 17/10/31.*/ @Component public class Service {public void test1(){test2();}@Transactional//此處的注解無效public void test2(){} }
?
2.被調(diào)用方不是一個(gè)public方法,被調(diào)用方的?@Transacational注解無效
@Component public class Service {@Resourceprivate Service1 service1;public void test1(){test2();service1.test3();}@Transactional//1.此處的注解無效public void test2(){} }?
package com.transacational;import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional;/*** Created by chenqimiao on 17/10/31.*/ @Component public class Service1 {@Transactional//2.此處注解無效protected void test3(){} }?
3.未開啟事務(wù)開關(guān),如:在SpringBoot中,啟動(dòng)類未使用?@EnableTransactionManagement
?
?
問題三、 如何理解@Transactional的超時(shí)時(shí)間?
?timeout是一個(gè)供開發(fā)者設(shè)置超時(shí)時(shí)間的屬性。默認(rèn)值-1,超時(shí)時(shí)間由具體的sql系統(tǒng)決定。 ?
/*** Created by chenqimiao on 17/10/31.*/ @Component public class Service3 {@Resourceprivate AdminInfoDoMapper adminInfoDoMapper;@Transactional(timeout = 4)//并不會(huì)超時(shí)public void test4(){adminInfoDoMapper.selectNameById(1);try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}} }?
超時(shí)時(shí)間具體的定義:事務(wù)開始(在該方法第一句代碼執(zhí)行之前)到最后一個(gè)Statement執(zhí)行完畢
所以象下面這樣寫,事務(wù)就會(huì)超時(shí)
@Component public class Service3 {@Resourceprivate AdminInfoDoMapper adminInfoDoMapper;@Transactional(timeout = 4)public void test4(){try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}adminInfoDoMapper.selectNameById(1);} }?
?
?
問題四、 @Transactional默認(rèn)的回滾策略?
默認(rèn)情況下,只有當(dāng)RuntimeException或其子類的異常被事務(wù)捕獲之后,事務(wù)才會(huì)回滾,如果要讓事務(wù)能夠回滾所有異常,必須手動(dòng)指定??@Transactional(rollbackFor=Exception.class)??,這樣繼承Exception的子類或者Exception本身都可以讓事務(wù)回滾。
轉(zhuǎn)載于:https://www.cnblogs.com/think-in-java/p/7764910.html
總結(jié)
以上是生活随笔為你收集整理的对Spring事务一些问题的讨论的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux脚本实现scp命令自动输入密码
- 下一篇: vue-devtools chrome