针对Spring 事务(@Transactional)失效的原因总结

本文探讨了在SpringBoot+Shiro+MyBatis+MySQL架构下,Service层数据库操作时事务未正常回滚的问题。分析了事务失效的多种可能原因,包括@Transactional注解缺失、方法访问修饰符不当、异常捕获不当、数据库引擎配置错误及Shiro与Spring初始化顺序冲突等,并提供了相应的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题描述

1、项目架构:SpringBoot+Shiro+mybatis+mysql

2、问题:在Service层对数据库进行持久化操作的时候,遇到异常发现事务没有回滚

      错误日志:

20:39:07.007 DEBUG org.mybatis.spring.SqlSessionUtils 148 registerSessionHolder - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@be0c571] was not registered for synchronization because synchronization is not active
20:39:07.018 DEBUG org.mybatis.spring.transaction.SpringManagedTransaction 87 openConnection - JDBC Connection [HikariProxyConnection@50504791 wrapping com.mysql.jdbc.JDBC4Connection@7f5c5cc3] will not be managed by Spring

事务没有被spring管理

二、问题排查

          在网上查了很多资料,总结了以下可能造成事务失效的原因

1、对应方法上面是否加上了@Transactional注解

2、方法是否是public方法

3、是否对方法进行了异常捕获,是否抛出的异常为非运行异常,因为@Transactional默认是在遇到运行异常时才会进行回滚,如果对方法进行了异常捕获或抛出异常为非运行异常都不会回滚,需要在@Transactional注解增加属性@Transactional(rollbackFor=Exception.class)

4、如果使用的mysql数据库,检查下数据库是否用的是InnoDB引擎,如果引擎没有问题检查innoDB变量值have_innodb 是否开启,查询语句 SHOW VARIABLES LIKE 'have_%'

5、还有一种常见问题,如果使用的是Spring+SpringMVC架构,SpringMVC只用扫描Controller层,检查下是否扫描了其他的包,造成了重复扫描。

6、最后一个原因,项目中使用了Shiro权限管理,并且调用了对应的Service,shiro 和 spring都会对该Service进行初始化,shiro在spring前就进行了初始化,从而造成了事务失效。

 

参考文章:https://blog.youkuaiyun.com/finalcola/article/details/81197584

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值