事务生效的前提
1、mysql 表支持事务,存储引擎:innodb
2、事务处理的类需要交个spring去管理。spring 事务管理器,底层是aop
3、开启事务。springboot选择声明式。配置类:@EnableTransactionManagement 方法级别:@Transactional
spring事务失效情况
自己调自己,事务默认传播机制情况下
public class Test01{
@Resource
private Test01 test01; //自己引用自己不会失效
//@Transaction //不失效
public void transaction(){
insertUser();//失效
updateUser();//失效
test01.insertUser();//不失效
test01.updateUser();//不失效()
}
@Transactional
public void insertUser(){
}
@Transactional
public void updateUser(){
}
}
2、主线程+子线程事务交织
3、设置错误的传播机制
@Transaction(propagation = Propagation.NEVER)
4、异常被自己捕获了,在catch没有抛出一个运行时异常或error
public class Test02{
@Transactional
public void insertUser(){
try{
//业务逻辑
}catch(Exception e){
}
}
}
5、指定事务回滚的异常类或指定不同的数据库
@Transactional(rollbackFor = MyException.class, transactionManager = "")
事务的其他问题
避免大事务
public class Test01{
@Resource
private Service service; //自己引用自己不会失效
@Transaction
public void transaction(){
//其他业务代码
....
//需要回滚的业务代码(可以将,需要回滚的方法封装其他)
service.insertUser();
service.updateUser();
}
}
编程式事务
public class Test01{
@Resource
private Service service; //自己引用自己不会失效
@Transaction
public void transaction(){
//其他业务代码
....
transactionTemplate.execute(transactionStatus -> {
service.insertUser();
service.updateUser();
return null;
});
}
}