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


被折叠的 条评论
为什么被折叠?



