Spring事务在哪些情况下失效

阅读文本大概需要3分钟。

0x01:如果数据库不支持事务,则失效

      因为事务是作用于数据库。例如使用MySQL且引擎是MyISAM,则事务会不起作用,因为MyISAM引擎本身不支持事务;如果改成InnoDB,则可以。

0x02:Service类没有被Spring管理

       因为Spring的事务是基于AOP,所以如果Service类没有被Spring管理,变成一个Spring Bean,即使添加了@Transactional注解,事务也是无效的。

0x03:内部调用

       不带事务的方法调用该类中带事务的方法,不会回滚。因为Spring的回滚是用过代理模式生成的,如果是一个不带事务的方法调用该类的带事务的方法,直接通过this.xxx()调用,而不生成代理事务,所以事务不起作用。常见解决方法“拆类

  1. @Service

  2. public class OrderServiceImpl implements OrderService {

  3. public void update(Order order) {

  4. updateOrder(order);

  5. }

  6. @Transactional

  7. public void updateOrder(Order order) {

  8. // update order

  9. }

  10. }

0x04:使用默认的事务处理方式

Spring的事务默认是对RuntimeException进行回滚,而不继承RuntimeException的不回滚。因为在java的设计中,它认为不继承RuntimeException的异常是CheckException或普通异常,如IOException,这些异常在java语法中是要求强制处理的。对于这些普通异常,Spring默认它们都已经处理,所以默认不回滚。可以添加rollbackfor=Exception.class来表示所有的Exception都回滚。

0x05:事务只能应用于 public 方法

       @Transactional注解只能应用于public方法,如果你在protected、private或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。

0x06数据源没有配置事务管理器

  1. // 其中 dataSource 框架会自动为我们注入

  2. @Bean

  3. public PlatformTransactionManager txManager(DataSource dataSource) {

  4. return new DataSourceTransactionManager(dataSource);

  5. }

如果要使用事务,没有配置事务管理器其他都是白搭。

Spring事务在哪些情况下失效

1. 全栈架构之打包推荐【建议收藏,常读】

2. 一个空格引发的“惨案“

3. 分布式系统中Session共享的常用方案

4Java语言“坑爹”排行榜TOP 10

5. 我是一个Java类(附带精彩吐槽)

6. mysql索引失效,差点我的工作凉了

7. 既生synchronized,何生volatile?

8. 微服务一直火,为什么服务化要搞懂?

9. MySQL的COUNT语句,不简单!

10. 漫画:HashSet和TreeSet实现与原理

Spring事务在哪些情况下失效

Spring事务在哪些情况下失效

扫码二维码关注我

·end·

—如果本文有帮助,请分享到朋友圈吧—

我们一起愉快的玩耍!

Spring事务在哪些情况下失效

你点的每个赞,我都认真当成了喜欢