spring的事务传播机制及代码示例

58 阅读1分钟

REQUIRED:如果之前没有事务则创建一个事务。如果之前有事务,则加入之前的事务。

REQUIRES_NEW:每次始终,始终创建一个新事务

SUPPORTS:如果之前有事务,则加入该事务,否则普通执行

NOT_SUPPORTED:如果之前有事务则暂停该事务,没有事务则普通执行

MANDATORY:必须有事务,如果没有事务就抛异常

NEVER:如果有事务,则抛异常

NESTED:如果有事务,则创建一个嵌套事务。如果父事务抛异常会回滚嵌套事务,反之,不会回滚父事务。

代码示例

使用REQUIRES_NEW,在for循环中,有一个方法,该方法涉及保存多张表,循环中有一次报错不会影响下一个循环的执行。

public void testRequiresNew(BaseInfoListDTO baseInfoList) {
    // xxx业务逻辑
    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 {
    /**
     * @param supplier
     * @return T
     * @description 有返回值的新事务提交
     */
    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
    public <T> T executeWithNew(Supplier<T> supplier) {
        return supplier.get();
    }
}
private boolean doHandler(BaseInfoListDTO baseInfoDto) {
    // xxx业务逻辑
    
}