• Spring 事务失效


    • 数据库引擎是否支持事务(Mysql 的 MyIsam引擎不支持事务);
    • 注解所在的类是否被加载为 Bean(是否被spring 管理);
    • 注解所在的方法是否为 public 修饰的;
    • 是否存在自身调用的问题;
    • 所用数据源是否加载了事务管理器;
    • @Transactional的扩展配置propagation是否正确。

    (1)数据库引擎不支持事务

    这里以 MySQL 为例,其 MyISAM 引擎是不支持事务操作的,InnoDB 才是支持事务的引擎,一般要支持事务都会使用 InnoDB。

    (2)没有被 Spring 管理

    // @Service
    public class OrderServiceImpl implements OrderService {
     
        @Transactional
        public void updateOrder(Order order) {
            // update order
        }
     
    }

    如果此时把 @Service 注解注释掉,这个类就不会被加载成一个 Bean,那这个类就不会被 Spring 管理了,事务自然就失效了。

    (3)方法不是 public 的

    @Transactional 只能用于 public 的方法上,否则事务会失效,如果要用在非 public 方法上,可以开启 AspectJ 代理模式。

    (4)自身调用问题

     ////////////update方法上面没有加 @Transactional 注解,调用有 @Transactional 注解的 updateOrder 方法
    @Service
    public class OrderServiceImpl implements OrderService {
     
        public void update(Order order) {
            updateOrder(order);
        }
     
        @Transactional
        public void updateOrder(Order order) {
            // update (order);
        }
     
    }

    ///////////////update方法上面没有加 @Transactional 注解,调用有 @Transactional 注解的 updateOrder 方法

    @Service
    public class OrderServiceImpl implements OrderService {
     
        @Transactional
        public void update(Order order) {
            updateOrder(order);
        }
     
        @Transactional(propagation = Propagation.REQUIRES_NEW)
        public void updateOrder(Order order) {
            // update order
        }
     
    }

    都不管用!

    因为它们发生了自身调用,就调该类自己的方法,而没有经过 Spring 的代理类,默认只有在外部调用事务才会生效。

    (4)数据源没有配置事务管理器

    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    (5)异常被吃了

    把异常吃了,然后又不抛出来,事务也不会回滚!

    @Service
    public class OrderServiceImpl implements OrderService {
     
        @Transactional
        public void updateOrder(Order order) {
            try {
                // update order
            } catch {
     
            }
        }
     
    }

    (6)异常类型错误

    @Service
    public class OrderServiceImpl implements OrderService {
     
        @Transactional
        public void updateOrder(Order order) {
            try {
                // update order
            } catch {
                throw new Exception("更新错误");
            }
        }
     
    }

    这样事务也是不生效的,因为默认回滚的是:RuntimeException,如果你想触发其他异常的回滚,需要在注解上配置一下,如:

    @Transactional(rollbackFor = Exception.class)
  • 相关阅读:
    css之position
    js之循环语句
    js之条件判断
    js之字典操作
    js之获取html标签的值
    5.15 牛客挑战赛40 C 小V和字符串 数位dp 计数问题
    5.21 省选模拟赛 luogu P4297 [NOI2006]网络收费 树形dp
    luogu P4525 自适应辛普森法1
    luogu P1784 数独 dfs 舞蹈链 DXL
    5.21 省选模拟赛 luogu P4207 [NOI2005]月下柠檬树 解析几何 自适应辛普森积分法
  • 原文地址:https://www.cnblogs.com/KL2016/p/15093736.html
Copyright © 2020-2023  润新知