@Transactional事务不生效问题解决(springboot)
springboot事務(wù)不生效的幾種解決方案
最近在業(yè)務(wù)中遇到了很奇怪的場景,在加上 @Transactional注解后,插入2條數(shù)據(jù),如果第二條出異常了,第一條不會回滾,排查了很久,上網(wǎng)也找資料看了很久,問題得以解決,總結(jié)了事務(wù)不生效的幾點可能的原因:
mysql的MyISAM引擎不支持回滾,如果需要自動回滾事務(wù),需要將mysql的引擎設(shè)置成InnoDB;
在業(yè)務(wù)中拋出異常時,本應(yīng)該被事務(wù)管理器捕獲的異常,被手動catch處理了,或者事務(wù)結(jié)果未滿足具體業(yè)務(wù)需求的,如果需要手動catch異常做業(yè)務(wù)處理,需要在catch里手動回滾事務(wù)TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(),或者在catch中主動拋出異常throw new RuntimeException();.
默認的spring事務(wù)只會捕獲RuntimeException,如果是非運行時異常也需要進行事務(wù)回滾的話,可以在@Transactional注解中加上rollbackfor = Exception.class屬性;
項目中沒有配置事務(wù)管理器(大坑!我遇到的就是這個),需要在配置類或者配置文件中配置,以本人的配置類為例,因為項目是多數(shù)據(jù)源的,所以要區(qū)別配置不同數(shù)據(jù)源的事務(wù)管理器.
數(shù)據(jù)源一:
?
數(shù)據(jù)源二:
?
可以看到,兩個事務(wù)管理器配置了不同的beanName,接下來只需要 在需要事務(wù)控制的位置加上該事務(wù)管理器的name就可以完美解決啦!
?
總結(jié)
以上是生活随笔為你收集整理的@Transactional事务不生效问题解决(springboot)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: scada系统集成_MES/MOM与WM
- 下一篇: aes 加密_结合RSA与AES实现前后