zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    Jmeter性能测试--自己看到的博客收集
    python日志logging
    java学习day12--API-File文件流
    java学习day12--API-IO简介--流简介
    java学习day12--API-SimpleDateFormat--BigDecimal/BigInteger类
    java学习day12--API-包装类-Date类
    equals方法和 == 的使用
    java学习day11--API--Object类-String类-StringBuilder类
    构造方法和普通方法的区别
    java中的修饰符总结
  • 原文地址:https://www.cnblogs.com/KL2016/p/15093736.html
Copyright © 2011-2022 走看看