事务提交后执行

1、事务提交后执行

场景如下:

  • 异步-记录日志:当事务提交后,再记录日志。
  • 发送mq消息:只有业务数据都存入表后,再发mq消息。

2、spring实现

//1、存在事务为true,不存在事务为false。
boolean flag = TransactionSynchronizationManager.isActualTransactionActive();
if (flag) {
    //1.1 存在事务
    TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
        @Override
        public void afterCommit() {
            //执行事务提交后流程
            log.info("事务提交后");
            handle();
        }
    });
    return;
}
//1.2 不存在事务
log.info("不存在事务");
handle();
  • TransactionSynchronizationManager.isActualTransactionActive()判断是否处于事务中。
  • afterCommit为事务提交后执行。

3、 TransactionSynchronization

3.1 源码

在上面的 TransactionSynchronizationManager 类中我们知道,事务操作的时候它的当前线程还保存了 TransactionSynchronization 对象。而这个对象伴随着 Spring 对 事务处理的各个生命周期都会有相应的扩展。

public interface TransactionSynchronization extends Flushable {

    /** 事务提交状态 */
    int STATUS_COMMITTED = 0;

    /** 事务回滚状态 */
    int STATUS_ROLLED_BACK = 1;

    /**系统异常状态 */
    int STATUS_UNKNOWN = 2;

    void suspend();

    void resume();

    void flush();

    // 事务提交之前
    void beforeCommit(boolean readOnly);

    // 事务成功或者事务回滚之前
    void beforeCompletion();

    // 事务成功提交之后
    void afterCommit();

    // 操作完成之后(包含事务成功或者事务回滚)
    void afterCompletion(int status);

}


版权声明:本文为xixingzhe2原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。