TransactionSynchronizationAdapter - 如何在事务不同状态下执行特定操作

TransactionSynchronizationAdapter - 如何在事务提交之后执行特定操作

一、前言

在 Java 项目中,有时候需要在事务某个阶段执行一些特定的操作,比如更新数据等,这个时候可以通过使用 TransactionSynchronizationAdapter 来实现特定逻辑操作。本文以 事务提交之后 为例,演示在事务提交之后执行特定操作。

二、示例代码

TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
                @Override
                public void afterCommit() {
                    testService.updateTable(paramDto);
                }
            });

三、代码详解

整体功能

这段代码借助 TransactionSynchronizationManager 注册一个事务同步适配器(TransactionSynchronizationAdapter),其目的是在当前事务成功提交后执行特定逻辑。

代码逐行分析

1.TransactionSynchronizationManager.registerSynchronization(…)

TransactionSynchronizationManager 属于 Spring 框架里用于管理事务同步的工具类。registerSynchronization 方法的作用是注册一个 TransactionSynchronization 对象,此对象会在事务的不同阶段(像提交、回滚等)被调用。

2. new TransactionSynchronizationAdapter()

TransactionSynchronizationAdapter 是一个抽象类,它实现了 TransactionSynchronization 接口,并且为接口中的方法提供了默认实现。借助创建 TransactionSynchronizationAdapter 的匿名内部类实例,你能够重写特定的方法,从而在事务的不同阶段执行自定义逻辑。

3. @Override public void afterCommit()

afterCommit 方法是 TransactionSynchronization 接口中的一个方法,它在事务成功提交之后被调用。通过重写这个方法,你可以定义在事务提交后要执行的逻辑。

4. testService.updateTable(paramDto);

afterCommit 方法里,调用了 testService 对象的 updateTable 方法,并且把 paramDto 对象当作参数传入。这表明在事务成功提交之后,会执行 updateTable 方法。

四、TransactionSynchronizationAdapter 重写方法

TransactionSynchronizationAdapter 是 Spring 框架中 TransactionSynchronization 接口的一个抽象实现类,它为 TransactionSynchronization 接口的所有方法提供了空实现,方便开发者只重写他们需要的方法。以下是 TransactionSynchronization 接口中定义的可以被重写的方法及其作用:

1. 事务生命周期相关方法

beforeCommit(boolean readOnly)
  • 作用:在事务提交之前调用,可用于执行一些预提交操作。参数 readOnly 表示当前事务是否为只读事务。
  • 示例用途:在事务提交前进行数据验证或记录日志。
afterCommit()
  • 作用:在事务成功提交之后调用,通常用于执行一些需要在事务提交后完成的操作,比如异步任务、消息发送等。
  • 示例用途:在数据库操作成功提交后,发送消息通知其他系统。
beforeCompletion()
  • 作用:在事务完成(提交或回滚)之前调用,无论事务最终是提交还是回滚,该方法都会被执行。
  • 示例用途:可以在这里进行资源清理操作,例如关闭文件、释放锁等。
afterCompletion(int status)
  • 作用:在事务完成(提交或回滚)之后调用,参数 status 表示事务的最终状态,其值可以是 TransactionSynchronization.STATUS_COMMITTED(事务已提交)、TransactionSynchronization.STATUS_ROLLED_BACK(事务已回滚)或 TransactionSynchronization.STATUS_UNKNOWN(未知状态)。
  • 示例用途:根据事务的最终状态进行不同的处理,如记录不同的日志信息。

2. 资源管理相关方法

flush()
  • 作用:当事务管理器决定刷新底层资源(如数据库会话)时调用,可用于刷新缓存或其他资源。
  • 示例用途:在数据库事务中,强制将缓存中的数据刷新到数据库。

3. 示例代码

import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationAdapter;
import org.springframework.transaction.support.TransactionSynchronizationManager;

public class CustomTransactionSynchronization extends TransactionSynchronizationAdapter {

    @Override
    public void beforeCommit(boolean readOnly) {
        System.out.println("Before commit, readOnly: " + readOnly);
    }

    @Override
    public void afterCommit() {
        System.out.println("After commit");
    }

    @Override
    public void beforeCompletion() {
        System.out.println("Before completion");
    }

    @Override
    public void afterCompletion(int status) {
        if (status == TransactionSynchronization.STATUS_COMMITTED) {
            System.out.println("Transaction committed");
        } else if (status == TransactionSynchronization.STATUS_ROLLED_BACK) {
            System.out.println("Transaction rolled back");
        } else {
            System.out.println("Transaction status unknown");
        }
    }

    @Override
    public void flush() {
        System.out.println("Flushing resources");
    }

    public static void main(String[] args) {
        // 注册自定义的事务同步器
        TransactionSynchronizationManager.registerSynchronization(new CustomTransactionSynchronization());

        // 模拟事务提交
        TransactionSynchronizationManager.getSynchronizations().forEach(sync -> {
            sync.beforeCommit(false);
            sync.afterCommit();
            sync.beforeCompletion();
            sync.afterCompletion(TransactionSynchronization.STATUS_COMMITTED);
            sync.flush();
        });
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YD_1989

分享不易,非常感谢您的鼓励支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值