Spring事务详解

作者: java面试收割机 | 来源:发表于2018-08-20 19:14 被阅读4次

    spring 事务不起作用的几种情况:
    1、spring MVC的spring-mvc.xml配置文件扫描了service 层,导致spring aop没有生成代理对象
    解决方法:让 mvc 只扫描控制层

    <!-- 启动自动扫描 -->
    <context:component-scan base-package="com.bingo.controller"/> 
    

    spring的配置文件扫描除控制层意外的包

    <!-- 启动自动扫描 -->
    <context:component-scan base-package="com.bingo"> 
            <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> 
    </context:component-scan> 
    

    2、入口的 SpringTransactionService的insert方法没有事务,但是SpringTransactionService的add方法有事务,此时add方法事务不起作用。原因是是因为insert方法没有事务,导致此时的SpringTransactionService不是代理对象,从而导致add事务不起作用,代码如下:

    @Service
    public class SpringTransactionServiceImpl implements SpringTransactionService{
    
        @Autowired
        private SpringTransactionMapper springTransactionMapper;
        
        @Override
        public int insert(TestZhu testZhu) {
            testZhu.setName("insert");;
            springTransactionMapper.insert(testZhu);
            add(testZhu);
            int i=1/0;
            return 1;
        }
    
        @Transactional(propagation=Propagation.REQUIRED)
        @Override
        public int add(TestZhu testZhu) {
            testZhu.setName("add");
            return springTransactionMapper.add(testZhu);
        }
    
    }
    

    解决方法:在入口方法 insert 上加上@Transactional(propagation=Propagation.REQUIRED)事务
    ,这样 service 对象一开始就会被代理,保证事务不会失效,spring 事务传播特性就会有效,即使 add 不结事务,insert 有事务,同样都会回滚。

    @Transactional(propagation=Propagation.REQUIRED)
        @Override
        public int insert(TestZhu testZhu) {
            testZhu.setName("insert");;
            springTransactionMapper.insert(testZhu);
            add(testZhu);
            int i=1/0;
            return 1;
        }
    
        @Transactional(propagation=Propagation.REQUIRED)
        @Override
        public int add(TestZhu testZhu) {
            testZhu.setName("add");
            return springTransactionMapper.add(testZhu);
        }
    
    

    所以要保证 spring 事务有效,同一 service 里的入口方法一定要有事务支持,否则同一service 里事务方法调用不会起作用。

    3、service 方法不能是 private 级别的

    相关文章

      网友评论

        本文标题:Spring事务详解

        本文链接:https://www.haomeiwen.com/subject/cpzliftx.html