Springカスタムアノテーションはトランザクションを実装します

まず、Springのトランザクションには2つの方法があります。プログラミングトランザクションと宣言型トランザクションです。

プログラミングトランザクション

プロジェクトでトランザクションマネージャーDataSourceTransactionManagerを取得します

トランザクション管理を使用してロールバック操作をコミットする

@Component
public class TransactionUtils {
    @Autowired
    private DataSourceTransactionManager dataSourceTransactionManager;
    //获取当前事务
    public TransactionStatus begin(){
        //采用默认传播行为
        TransactionStatus transaction = dataSourceTransactionManager.getTransaction(new DefaultTransactionAttribute());
        return transaction;
    }
    //提交
    public void commit(TransactionStatus transaction){
        dataSourceTransactionManager.commit(transaction);
    }
    public void rollback(TransactionStatus transaction){
        dataSourceTransactionManager.rollback(transaction);
    }
}

ビジネスレイヤー

@RestController
public class TxServiceImpl {
    @Autowired
    private TransactionUtils transactionUtils;
    //采取事务
    @GetMapping("/tx")
    public String insertUser(User user){
        TransactionStatus begin == null;
        //begin开启事务,若不提交相当于对数据使用行锁
        try {
            begin = transactionUtils.begin();
            String res = userMapper.insert(user)>0?"成功":"失败";
            int j = 1/user.getUserId();
            transactionUtils.commit(begin);
            return res;
        }catch (Exception e){
            if (begin != null){
                transactionUtils.rollback(begin);
                return "系统错误";
            }

        }
    }
}

強力なコードの繰り返しと優れたスケーラビリティ

トランザクションを宣言します

アノテーション@Transactionalを追加するだけです

メソッドが実行されると、aopはインターセプトを取得し、それが成功したか異常であるかを判断して、対応するアクションを実行します。

失敗の問題:

メソッドでtryを使用して例外がキャッチされた場合、例外はaopにスローされず、ロールバックされません。

キャッチで使用するには、手動でロールバックする必要があります

TransactionAspectSupport.currentTransactionStatus()。set
RollbackOnly();

カスタムアノテーション

注釈を作成する

//作用范围
@Target({ElementType.METHOD,ElementType.TYPE})
//通过反射机制获取注解
@Retention(RetentionPolicy.RUNTIME)
@Inherited
//注释文档
@Documented
public @interface MyTransactional {
}

aopインターセプトメソッドを定義する

@Component
@Aspect
public class ExtTransactionalAop {
    @Autowired
    private TransactionUtils transactionUtils;
    //拦截方法上有自定义注解 走环绕通知
    @Around(value = "@annotation(com.lzq.aop.MyTransactional)")
    public Object around(ProceedingJoinPoint joinPoint){
        TransactionStatus begin = null;
        try {
            begin = transactionUtils.begin();
            //获取目标方法
            Object res = joinPoint.proceed();
            transactionUtils.commit(begin);
            return res;
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            if (begin != null){
                transactionUtils.rollback(begin);
            }
            return "系统错误";
        }
    }
}

この時点で、メソッドにカスタムアノテーションを追加できます

おすすめ

転載: blog.csdn.net/weixin_52210557/article/details/123684360