标签:事务 Spring Transactional 注解 方法 public
有时候,我们明明在类或者方法上添加了@Transactional注解,却发现方法并没有按事务处理。其实,以下场景会导致Spring的@Transactional事务失效。
1、事务方法所在的类没有加载到Spring IOC容器中。
@Transactional是Spring的注解,未被Spring管理的类中的方法不受@Transactional注解控制,这个应该很好理解。
2、方法没有被public修饰。
众所周知,java的访问权限修饰符有:private
、default
、protected
、public
四种,但是@Transactional
注解只能作用于public
修饰的方法上。具体为什么会这样,我也没理解,就先记住吧。
3、在同一个类中的方法调用@Transactional方法。
假如在同一个类中有A、B两个方法,如下:
@Service public class UserServiceImpl { @Autowired UserMapper userMapper; public void A() { B(); } @Transactional public void B() { userMapper.deleteById(1); int i = 10 / 0; //模拟发生异常 } }
像上面的代码,B
方法使用@Transactional
注解标注,在A()
方法中调用了B()
方法,在外部调用A()
方法时,B()方法的事务不会生效。这是由于使用Spring AOP
代理造成的,因为只有当事务方法被当前类以外的代码调用时,才会由Spring
生成的代理对象来管理。
4、方法的事务传播类型不支持事务。
当@Transactional的propagation设置为NOT_SUPPORTED时,也就是@Transactional方法总是非事务方式执行。(Spring事务传播行为可以查阅我之前的一篇文章:Spring事务(一)-事务传播行为)
5、不正确地捕获异常。
使用了try-catch代码块将异常捕捉了,没有向上抛出异常,事务不会回滚。
6、标注错误的异常类型。
Spring事务默认回滚类型是RuntimeException类型,如果没有制定回滚的类型,抛出的错误不是RuntimeException类型,则无法回滚。
7、数据库不支持事务。
以MySQL为例,InnoDB引擎是支持事务的,而像MyISAM、MEMORY等是不支持事务的。 从MySQL5.5.5开始默认的存储引擎是InnoDB,之前默认都是MyISAM。
标签:事务,Spring,Transactional,注解,方法,public 来源: https://www.cnblogs.com/ayic/p/16698508.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。