美文网首页程序员
TransactionManager事务提交之后执行xxx操作

TransactionManager事务提交之后执行xxx操作

作者: ElevenKing | 来源:发表于2020-05-28 10:49 被阅读0次

需求:在保证事务提交之后执行某些操作。


image.png

解决:

TransactionSynchronizationManager.registerSynchronization(
    new TransactionSynchronizationAdapter() {    
        @Override    
        public void afterCommit() {        
          //do something   
        }
});

源码:

/**
     * Register a new transaction synchronization for the current thread.
     * Typically called by resource management code.
     * <p>Note that synchronizations can implement the
     * {@link org.springframework.core.Ordered} interface.
     * They will be executed in an order according to their order value (if any).
     * @param synchronization the synchronization object to register
     * @throws IllegalStateException if transaction synchronization is not active
     * @see org.springframework.core.Ordered
     */
    public static void registerSynchronization(TransactionSynchronization synchronization)
            throws IllegalStateException {

        Assert.notNull(synchronization, "TransactionSynchronization must not be null");
        Set<TransactionSynchronization> synchs = synchronizations.get();
        if (synchs == null) {
            throw new IllegalStateException("Transaction synchronization is not active");
        }
        synchs.add(synchronization);
    }

看第一行注释 Register a new transaction synchronization for the current thread.

为当前线程注册一个事务synchronization ,

注册到哪了呢,猜也猜到了,当然是ThreadLocal啦!

注册的是嘛玩意呢?

从最初的代码可以看到注册是的 TransactionSynchronizationAdapter(从明明后缀可以知道这个是适配器接口)

源码中ThreadLocal中维护的是一个 TransactionSynchronization的列表

TransactionSynchronization定义了beforeCommit,afterCommit等方法

TransactionSynchronizationAdapter正是TransactionSynchronization的抽象实现

image.png

可以看到都是空实现,这样设计的好处是,当业务需要用到时,无需实现接口全部的方法, 按需实现即可。典型的适配器模式。

讲了那么多,看一下事务提交后是怎么调用TransactionSynchronization 的呢??? 看到这里估计你心中已有了答案。

org.springframework.transaction.support.AbstractPlatformTransactionManager#processCommit

//提交事务的核心逻辑
private void processCommit(DefaultTransactionStatus status) throws TransactionException {
    //…… 省略无关代码
    //提交事务
    doCommit(status);
    //看这里,处理提交事务之后的逻辑
    triggerAfterCommit(status);
    //……省略无关代码
 
}


private void triggerAfterCommit(DefaultTransactionStatus status) {
    TransactionSynchronizationUtils.triggerAfterCommit();
}

//TransactionSynchronizationManager.getSynchronizations()就是获取所有注册的Synchronizations并排个序啥的
public static void triggerAfterCommit() {
    invokeAfterCommit(TransactionSynchronizationManager.getSynchronizations());
}


//最终就在这了
public static void invokeAfterCommit(@Nullable List<TransactionSynchronization> synchronizations) {
        if (synchronizations != null) {
            for (TransactionSynchronization synchronization : synchronizations) {
                synchronization.afterCommit();
            }
        }
}

总结: 一个好的框架里有非常多的设计思想和code风格值的学习。
当前还有一种更为优雅的方式(注解+事件驱动,摆脱硬编码,减少代码侵入),可以解决类似问题。
预知后事如何,且听下回分解

相关文章

  • TransactionManager事务提交之后执行xxx操作

    需求:在保证事务提交之后执行某些操作。 解决: 源码: 看第一行注释 Register a new transac...

  • 面试题

    怎么保证异步操作 在事务提交之后执行 TransactionSynchronizatonManger.regist...

  • 3.概念

    1.自动提交:当你的sql语句执行完毕,提交事务,数据库更新操作之间保存到数据2.手动提交事务:在你需要提交事务的...

  • TCL 事务控制

    事务:作为单个逻辑单元执行的一系列操作,要么完全地执行,要么完全地不执行。commit 提交事务rollback ...

  • 【Mysql】-5 事务

    事务概述 事务提交 事务回滚 事务概述 事务是只用户定义的一系列数据库更新、修改操作,这些操作要么都不执行,要么都...

  • 数据库操作(事务与锁)

    数据操作的流程:发起事务--锁定表--执行逻辑计算--完成事务--提交 事务 概念:指作为单个逻辑工作单元执行的一...

  • 分布式事务

    一、2pc 两阶段提交, 1、预提交(准备提交) 通知各个操作开始执行事务,并搜集各个操作返回的结果。 2、提交或...

  • 事务隔离级别

    事务隔离特性 支持事务的数据库必须满足四个特性: 原子性:整个操作要么执行成功,要么执行失败 持久化:事务提交后就...

  • gorm-V2-08 事务

    1. 语法 开启事务 在事务中执行操作 从这里开始使用 'tx',而不是 'db' 400 回滚事务 提交这个事务...

  • SQLiteDatabase事务操作为什么一定要执行endTra

    只有执行了endTransaction方法,事务操作才会真正提交到数据库。来看源码:

网友评论

    本文标题:TransactionManager事务提交之后执行xxx操作

    本文链接:https://www.haomeiwen.com/subject/jfjqnhtx.html