Spring事務(wù)失效的8大原因詳解
Spring事務(wù)失效的8大原因
- 數(shù)據(jù)庫(kù)引擎不支持事務(wù)(都默認(rèn)InnoDB了,一般不會(huì)發(fā)生)
- 沒(méi)有被 Spring 管理
- 方法不是 public 的
- 自身調(diào)用問(wèn)題(常見(jiàn)!)
- 數(shù)據(jù)源沒(méi)有配置事務(wù)管理器
- 不支持事務(wù)
- 異常被吃了(常見(jiàn)?。?/li>
- 異常類(lèi)型錯(cuò)誤(常見(jiàn)!)
1、數(shù)據(jù)庫(kù)引擎不支持事務(wù)
- 這里以 MySQL 為例,其 MyISAM 引擎是不支持事務(wù)操作的,InnoDB 才是支持事務(wù)的引擎,一般要支持事務(wù)都會(huì)使用 InnoDB。
- 從 MySQL 5.5.5 開(kāi)始的默認(rèn)存儲(chǔ)引擎是:InnoDB,之前默認(rèn)的都是:MyISAM,所以這點(diǎn)要值得注意,底層引擎不支持事務(wù)再怎么搞都是白搭。
2、沒(méi)有被 Spring
管理 沒(méi)有被Spring管理,這個(gè)類(lèi)就不會(huì)被加載成一個(gè) Bean,那這個(gè)類(lèi)就不會(huì)被 Spring 管理了,事務(wù)自然就失效了。
3、方法不是 public 的
@Transactional 只能用于 public 的方法上,否則事務(wù)不會(huì)失效,如果要用在非 public 方法上,可以開(kāi)啟 AspectJ 代理模式。
4、自身調(diào)用問(wèn)題
@Service public class OrderServiceImpl implements OrderService { @Transactional public void update(Order order) { updateOrder(order); } @Transactional(propagation = Propagation.REQUIRES_NEW) public void updateOrder(Order order) { // update order } }
- 這次在 update 方法上加了 @Transactional,updateOrder 加了 REQUIRES_NEW 新開(kāi)啟一個(gè)事務(wù),那么新開(kāi)的事務(wù)管用么?答案是:不管用!
- 因?yàn)樗鼈儼l(fā)生了自身調(diào)用,就調(diào)該類(lèi)自己的方法,而沒(méi)有經(jīng)過(guò) Spring 的代理類(lèi),默認(rèn)只有在外部調(diào)用事務(wù)才會(huì)生效。
- 解決方案之一就是在的類(lèi)中注入自己,用注入的對(duì)象再調(diào)用另外一個(gè)方法。
5、數(shù)據(jù)源沒(méi)有配置事務(wù)管理器
@Bean public PlatformTransactionManager transactionManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); }
如上面所示,當(dāng)前數(shù)據(jù)源若沒(méi)有配置事務(wù)管理器,那也是白搭!
6、不支持事務(wù)
@Transactional(propagation = Propagation.NOT_SUPPORTED)
Propagation.NOT_SUPPORTED: 表示不以事務(wù)運(yùn)行,當(dāng)前若存在事務(wù)則掛起,都主動(dòng)不支持以事務(wù)方式運(yùn)行了,那事務(wù)生效也是白搭!
7、異常被吃了
// @Service public class OrderServiceImpl implements OrderService { @Transactional public void updateOrder(Order order) { try { // update order } catch { } } }
把異常吃了,然后又不拋出來(lái),事務(wù)怎么回滾吧!
8、異常類(lèi)型錯(cuò)誤
// @Service public class OrderServiceImpl implements OrderService { @Transactional public void updateOrder(Order order) { try { // update order } catch { throw new Exception("更新錯(cuò)誤"); } } }
這樣事務(wù)也是不生效的,因?yàn)槟J(rèn)回滾的是:RuntimeException,如果你想觸發(fā)其他異常的回滾,需要在注解上配置一下,如:
@Transactional(rollbackFor = Exception.class)
這個(gè)配置僅限于 Throwable 異常類(lèi)及其子類(lèi)。
到此這篇關(guān)于Spring事務(wù)失效的8大原因詳解的文章就介紹到這了,更多相關(guān)Spring事務(wù)失效內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot中事務(wù)失效的原因詳解
- SpringBoot中事務(wù)失效的六個(gè)原因解析
- 關(guān)于SpringBoot中事務(wù)失效的幾種情況
- Spring事務(wù)失效之常見(jiàn)場(chǎng)景分析
- Spring事務(wù)失效的場(chǎng)景梳理總結(jié)
- Spring事務(wù)失效的各種場(chǎng)景(13種)
- Spring詳細(xì)講解事務(wù)失效的場(chǎng)景
- Spring事務(wù)失效場(chǎng)景實(shí)例詳解
- Spring事務(wù)失效場(chǎng)景的詳細(xì)整理
- Spring事務(wù)失效的原因及解決方案
相關(guān)文章
Springboot注解之@EnableAutoConfiguration詳解
這篇文章主要介紹了Springboot注解之@EnableAutoConfiguration詳解,@EnableAutoConfiguration是一個(gè)加載Starter目錄包之外的需要Spring自動(dòng)生成bean對(duì)象,本文對(duì)其進(jìn)行總結(jié),需要的朋友可以參考下2023-08-08Mybatis-Plus的應(yīng)用場(chǎng)景描述及注入SQL原理分析
MyBatis-Plus是一個(gè) MyBatis 的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開(kāi)發(fā)、提高效率而生,本文重點(diǎn)給大家介紹Mybatis-Plus的應(yīng)用場(chǎng)景及注入SQL原理分析,感興趣的朋友跟隨小編一起學(xué)習(xí)吧2021-05-05SpringBoot中整合Shiro實(shí)現(xiàn)權(quán)限管理的示例代碼
這篇文章主要介紹了SpringBoot中整合Shiro實(shí)現(xiàn)權(quán)限管理的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Java的Struts框架中<results>標(biāo)簽的使用方法
這篇文章主要介紹了Java的Struts框架中<results>標(biāo)簽的使用方法,Struts框架是Java的SSH三大web開(kāi)發(fā)框架之一,需要的朋友可以參考下2015-11-11詳解備忘錄模式及其在Java設(shè)計(jì)模式編程中的實(shí)現(xiàn)
這篇文章主要介紹了詳解備忘錄模式及其在Java設(shè)計(jì)模式編程中的實(shí)現(xiàn),備忘錄模式數(shù)據(jù)的存儲(chǔ)過(guò)程中應(yīng)當(dāng)注意淺拷貝和深拷貝的問(wèn)題,需要的朋友可以參考下2016-04-04關(guān)于IDEA中spring-cloud-starter-alibaba-nacos-discovery 無(wú)法引入問(wèn)題
這篇文章主要介紹了關(guān)于IDEA中spring-cloud-starter-alibaba-nacos-discovery 無(wú)法引入問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02