日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

@Transactional事务不生效问题解决(springboot)

發(fā)布時間:2025/3/15 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 @Transactional事务不生效问题解决(springboot) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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ù)源一:
?

@Bean(name = "detDataSource")public DataSource getDataSource() {return createDataSource();}@Bean(name = "detTransactionManager")public PlatformTransactionManager txManager(@Qualifier("detDataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}


數(shù)據(jù)源二:

@Primary@Bean(name = "shardDataSource")public DataSource getDataSource() {return buildDataSource();}@Bean(name = "shardTransactionManager")public PlatformTransactionManager txManager(@Qualifier("shardDataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}

?



可以看到,兩個事務(wù)管理器配置了不同的beanName,接下來只需要 在需要事務(wù)控制的位置加上該事務(wù)管理器的name就可以完美解決啦!

@Override@Transactional(value = "detTransactionManager",rollbackFor = Exception.class)public int updateOrInsert(BaseRequest<BankTemplateDto> param) {

?

總結(jié)

以上是生活随笔為你收集整理的@Transactional事务不生效问题解决(springboot)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。