SpringBoot中事務失效的原因詳解
SpringBoot事務失效的原因
1.數(shù)據(jù)庫是否支持事務
- mysql InnoDB(支持事務) MyISAM(不支持事務)
- oracle 默認支持事務
2.是否開始事務
- 如果沒有開啟事務需要手動開啟 @EnableTransactionManagement
- 需要在開啟事務的方法上增加 @Transactional
3.springboot項目中是否注入到springboot里
- 是否被注入到springboot的一級緩存里邊,是否被springboot的添加注解所修飾,例如@Controller @RestController @Service @Component 等
- 增加注解后,是否被@ComponentScan掃描到( @SpringBootApplication 同包下邊也可以)
4.方法是否為private static final 修飾
通過注解開啟事務本身就需要做代理才可以獲取,方法加上這些修飾就不能被代理了
5.是否try catch了異常、是否throw 了異常
//try catch異常方法失效
try{
int a = 10/0;
}catch(Exception e){
}
//try catch 并throw了異常,事務生效
try{
int a = 10/0;
}catch(Exception e){
throw new RunTimeException("");
}
6.@Transactional里捕獲的異常是否可以包含拋出的異常
//捕獲的異常和拋出的異常不是包含關(guān)系,事務就會失效
@Transactional(rollbackFor = RunTimeException.class)
public void add(){
throw new IOException("");
}
7.事務的傳播機制,是否是非事務運行
| 傳播機制 | 解析 |
| REQUIRED | 如果當前存在事務就加入事務,如果當前不存在事務就創(chuàng)建事務 |
| REQUIRES_NEW | 重新創(chuàng)建一個事務,如果當前存在事務,就把當前事務掛起 |
| SUPPORTS | 支持當前事務,如果沒有事務就已非事務方式運行 |
| NOT_SUPPORTED | 已非事務方式運行,如果存在事務就掛起當前事務 |
| MANDATORY | 支持當前事務,如果沒有事務就拋出異常 |
| NEVER | 已非事務方式運行,如果存在事務就拋出異常 |
| NESTED | 嵌套事務運行,和REQUIRED類似 |
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void add(){
throw new IOException("");
}
8.同一個類里邊調(diào)用事務
是否需要走代理,例如注入自己、或使用AopContext
這樣事務update就會失效
@Service
public class Order{
@Transactional
public void add(){
new Thread(()->{
this.update();
}).start;
}
@Transactional
public void update(){}
}
事務update生效
@Service
public class Order{
@Autowired
Order order;
@Transactional
public void add(){
new Thread(()->{
order.update();
}).start;
}
@Transactional
public void update(){}
}
到此這篇關(guān)于SpringBoot中事務失效的原因詳解的文章就介紹到這了,更多相關(guān)SpringBoot事務失效的原因內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于spring+quartz的分布式定時任務框架實現(xiàn)
在Spring中的定時任務功能,最好的辦法當然是使用Quartz來實現(xiàn)。這篇文章主要介紹了基于spring+quartz的分布式定時任務框架實現(xiàn),有興趣的可以了解一下。2017-01-01
Java微信公眾平臺開發(fā)(15) 微信JSSDK的使用
這篇文章主要為大家詳細介紹了Java微信公眾平臺開發(fā)第十五步,微信JSSDK的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04
java實現(xiàn)二叉樹的創(chuàng)建及5種遍歷方法(總結(jié))
下面小編就為大家?guī)硪黄猨ava實現(xiàn)二叉樹的創(chuàng)建及5種遍歷方法(總結(jié))。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04
Spring Boot MyBatis 連接數(shù)據(jù)庫配置示例
本篇文章主要介紹了Spring Boot MyBatis 連接數(shù)據(jù)庫示例的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-02-02
java為什么會出現(xiàn)精度丟失這種現(xiàn)象你知道嗎
這篇文章主要介紹了Java精度丟失的問題,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下,希望能夠給你帶來幫助2021-08-08
Java的靜態(tài)方法Arrays.asList()使用指南
Arrays.asList() 是一個 Java 的靜態(tài)方法,它可以把一個數(shù)組或者多個參數(shù)轉(zhuǎn)換成一個 List 集合,這個方法可以作為數(shù)組和集合之間的橋梁,方便我們使用集合的一些方法和特性,本文將介紹 Arrays.asList() 的語法、應用場景、坑點和總結(jié)2023-09-09

