事务的传播特性与理解
事务的传播在Spring注解中使用@Transactional(propagation=Propagation.REQUIRED)
来配置。
事务的传播类型
1. REQUIRED 默认值
如果已经存在事务,则加入此事务中执行;如果不存在事务,则新建事务执行。
一般使用此模式就能满足绝大多数业务逻辑。
2. SUPPORTS
如果当前存在事务,则加入此事务中执行;如果当前不存在事务,则以非事务方式执行。
3. NOT_SUPPORTED
始终以非事务方式执行;如果当前存在事务,则挂起事务。
4. REQUIRES_NEW
始终在新事务中执行;如果当前存在事务,则新建事务执行。
5. NEVER
以非事务方式执行;如果当前存在事务,则抛出异常。
6. MANDATORY
始终以事务方式执行;如果当前不存在事务,则抛出异常。
事务传播特性示例中理解
1. 使用NOT_SUPPORTED
如果我们在一个事务方法中需要记录操作日志,这个时候我们就可以把日志记录方法设置为NOT_SUPPORTED
。
@Transactional(propagation=Propagation.NOT_SUPPORTED)
public void saveLog() {
// ...
}
@Transactional(propagation=Propagation.REQUIRED)
public void dealTransactional() {
saveLog();
// xxx
}
2. 使用REQUIRES_NEW
如果我们在一个事务方法中需要执行另一个事务方法,并且不想另一个事务方法导致的回滚影响本事务方法,这个时候就适合使用REQUIRES_NEW
。
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void otherTransactional() {
// ...
}
@Transactional(propagation=Propagation.REQUIRED)
public void dealTransactional() {
// xxx
otherTransactional();
}