REQUIRED:如果之前没有事务则创建一个事务。如果之前有事务,则加入之前的事务。
REQUIRES_NEW:每次始终,始终创建一个新事务
SUPPORTS:如果之前有事务,则加入该事务,否则普通执行
NOT_SUPPORTED:如果之前有事务则暂停该事务,没有事务则普通执行
MANDATORY:必须有事务,如果没有事务就抛异常
NEVER:如果有事务,则抛异常
NESTED:如果有事务,则创建一个嵌套事务。如果父事务抛异常会回滚嵌套事务,反之,不会回滚父事务。
代码示例
使用REQUIRES_NEW,在for循环中,有一个方法,该方法涉及保存多张表,循环中有一次报错不会影响下一个循环的执行。
public void testRequiresNew(BaseInfoListDTO baseInfoList) {
for (BaseInfoListDTO baseInfoDto : baseInfoList) {
try {
boolean flag = transactionOperationUtil.executeWithNew(() -> doHandler(baseInfoDto));
if (flag) {
break;
}
} catch (Exception e) {
log.error(e.getMessage());
}
}
}
@Component
public class TransactionOperationUtil {
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
public <T> T executeWithNew(Supplier<T> supplier) {
return supplier.get();
}
}
private boolean doHandler(BaseInfoListDTO baseInfoDto) {
}