1.数据库是否支持事务
mysql InnoDB(支持事务) MyISAM(不支持事务) oracle 默认支持事务
2.是否开始事务
如果没有开启事务需要手动开启 @EnableTransactionManagement
需要在开启事务的方法上增加 @Transactional
3.springboot项目中是否注入到springboot里
是否被注入到springboot的一级缓存里边,是否被springboot的添加注解所修饰,例如@Controller @RestController @Service @Component 等,增加注解后,是否被@ComponentScan扫描到( @SpringBootApplication 同包下边也可以)
4.方法是否为private static final 修饰
通过注解开启事务本身就需要做代理才可以获取,方法加上这些修饰就不能被代理了
5.是否try catch了异常、是否throw 了异常
##try catch异常方法失效
try{
int a = 10/0;
}catch(Exception e){
}
##try catch 并throw了异常,事务生效
try{
int a = 10/0;
}catch(Exception e){
throw new RunTimeException("");
}
6.@Transactional里捕获的异常是否可以包含抛出的异常
##捕获的异常和抛出的异常不是包含关系,事务就会失效
@Transactional(rollbackFor = RunTimeException.class)
public void add(){
throw new IOException("");
}
7.事务的传播机制,是否是非事务运行
传播机制 | 解析 |
---|
REQUIRED | 如果当前存在事务就加入事务,如果当前不存在事务就创建事务 | REQUIRES_NEW | 重新创建一个事务,如果当前存在事务,就把当前事务挂起 | SUPPORTS | 支持当前事务,如果没有事务就已非事务方式运行 | NOT_SUPPORTED | 已非事务方式运行,如果存在事务就挂起当前事务 | MANDATORY | 支持当前事务,如果没有事务就抛出异常 | NEVER | 已非事务方式运行,如果存在事务就抛出异常 | NESTED | 嵌套事务运行,和REQUIRED类似 |
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void add(){
throw new IOException("");
}
8.同一个类里边调用事务,是否需要走代理,例如注入自己、或使用AopContext
这样事务update就会失效
@Service
public class Order{
@Transactional
public void add(){
this.update();
}
@Transactional
public void update(){}
}
事务生效
@Service
public class Order{
@Autowired
Order order;
@Transactional
public void add(){
order.update();
}
@Transactional
public void update(){}
}
事务生效
@Service
public class Order{
@Transactional
public void add(){
Order order = (Order)AopContext.currentProxy();
order.update();
}
@Transactional
public void update(){}
}
|