欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 旅游 > TransactionSynchronizationAdapter - 如何在事务不同状态下执行特定操作

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

2025/4/19 1:24:57 来源:https://blog.csdn.net/m0_58680865/article/details/147119191  浏览:    关键词:TransactionSynchronizationAdapter - 如何在事务不同状态下执行特定操作

文章目录

  • TransactionSynchronizationAdapter - 如何在事务提交之后执行特定操作
    • 一、前言
    • 二、示例代码
    • 三、代码详解
      • 整体功能
      • 代码逐行分析
        • 1.TransactionSynchronizationManager.registerSynchronization(...)
        • 2. new TransactionSynchronizationAdapter()
        • 3. @Override public void afterCommit()
        • 4. testService.updateTable(paramDto);
    • 四、TransactionSynchronizationAdapter 重写方法
      • 1. 事务生命周期相关方法
        • beforeCommit(boolean readOnly)
        • afterCommit()
        • beforeCompletion()
        • afterCompletion(int status)
      • 2. 资源管理相关方法
        • flush()
      • 3. 示例代码

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

一、前言

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

二、示例代码

TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {@Overridepublic 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 {@Overridepublic void beforeCommit(boolean readOnly) {System.out.println("Before commit, readOnly: " + readOnly);}@Overridepublic void afterCommit() {System.out.println("After commit");}@Overridepublic void beforeCompletion() {System.out.println("Before completion");}@Overridepublic 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");}}@Overridepublic 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();});}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词