事务传播机制
用来控制方法之间事务的传播行为,如a方法调用b方法,a方法开启了事务,b方法也需要事务。这时候需要判断b方法是使用a方法的事务,还是单独开启新的事务。Spring @Transactional注解中可以通过propagation属性设置
- 使用原事务:Propagation.REQUIRED
- 开启新事务: Propagation.REQUIRES_NEW
注意⚠️: 本类方法互调会出现事务配置失效!场景如下
@Transactional(propagation = Propagation.REQUIRED, timeout = 30)
public void a() {
b();
c();
}
@Transactional(propagation = Propagation.REQUIRED, timeout = 5)
public void b() {
}
@Transactional(propagation = Propagation.REQUIRES_NEW, timeout = 10)
public void c() {
}
某个服务类的三个事务方法,都设置了事务传播行为和超时时间。使用默认spring事务方法时,方法b和方法c的设置都会失效。原因是@Transactional事务注解是通过代理对象实现的,直接在本类中调用,可以看作this.b()、this.c(),会绕过代理对象。解决方案如下:
启动类使用@EnableAspectJAutoProxy(exposeProxy = true)注解,并设置暴露代理对象
调用时首先获取当前Service类对应的代理对象,使用代理对象调用方法即可生效
事务隔离级别
Spring @Transactional注解中可以通过isolation属性设置事务隔离级别
- Isolation.READ_COMMITTED:读提交,解决脏读
- Isolation.REPEATABLE_READ:可重复读,解决幻读