springspring cloud微服务

Spring事务详解

2018-08-20  本文已影响4人  java面试收割机

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 级别的

上一篇下一篇

猜你喜欢

热点阅读