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