文章目录
- 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();});}
}