TransactionSynchronizationManager 介绍
直译是事务同步管理器(者),来源为 spring 框架
org.springframework.transaction.support
内部存在很多ThreadLocal 用管理资源,使用Spring 时事务链接也都会交给Spring 管理和开启,不论是通过注解 @Transactional 还是xml Bean 的方式加入事务管理,最终都会向其中写入事务实例,用于 spring 自动处理数据源的链接,事务的提交等等操作。
使用场景
当我们需要将某一些操作放到事务提交之前或者事务提交之后等等时机去执行的时候就可以使用 TransactionSynchronizationManager 来控制。
实际使用
共两种 一种是使用匿名方式去实现接口提供的方法,在需要在某一时机或情况下执行的方法内放入自己要执行的代码,可以开启异步线程。
不需要的方法里面无需加入内容
如下:
// 某一方法中
public void xxxServiceMethods(){
// 其他业务代码
......
......
......
// 某一段需要切入事务内实现的
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
// 暂停此同步 应该从事务同步管理器中解绑资源(如果有的话)
@Override
public void suspend() {
}
// 恢复此同步。 应该将资源重新绑定到 TransactionSynchronizationManager(如果管理任何资源)。
@Override
public void resume() {
}
// 将基础会话刷新到数据存储(如果适用): * 例如,Hibernate/JPA 会话。
@Override
public void flush() {
}
// 在事务提交之前调用(在“完成之前”之前)。
//例如,可以将事务性 O/R 映射会话刷新到数据库。 此回调并不意味着事务将实际提交。调用此方法后仍可能发生回滚决策。此回调更确切地说,是为了执行仅在提交仍然有机会时才相关的工作发生,例如将 SQL 语句刷新到数据库。 请注意,异常将传播到提交调用方并导致回滚事务。
@Override
public void beforeCommit(boolean readOnly) {
}
// 在事务提交/回滚之前调用。
// 可以在事务完成之前进行资源清理。 此方法将在 {@code 之前提交} 之后调用,即使 {@code beforeCommit} 抛出了一个异常。此回调允许在交易完成之前关闭资源,以获得任何结果。
@Override
public void beforeCompletion() {
}
// 在事务提交后调用。
// 可以正确执行进一步的操作 在主事务成功提交后。
// 例如,可以提交应该在成功后跟进的进一步操作提交主事务,如确认消息或电子邮件。注意:事务已经提交,但事务资源可能仍处于活动状态且可访问。因此, 此时触发的任何数据访问代码仍将“参与”在原始事务,允许执行一些清理(没有提交跟随 不再!),除非它明确声明它需要在单独的交易。因此:将 {@code PROPAGATION_REQUIRES_NEW} 用于任何从此处调用的事务操作。
@Override
public void afterCommit() {
}
// 在事务提交/回滚后调用。
// 事务完成后可以进行资源清理。
// 注意:事务将已提交或回滚, 但事务资源可能仍处于活动状态且可访问。作为结果,此时触发的任何数据访问代码仍将“参与” 在原始事务中,允许执行一些清理(无需提交)跟随!),除非它明确声明它需要在单独交易。因此:使用 {@code PROPAGATION_REQUIRES_NEW}对于从此处调用的任何事务操作。
@Override
public void afterCompletion(int status) {
}
});
}
第二种
实际上我们大部分时候只需要其中一个方法重写即可,不需要那么多,而 TransactionSynchronizationAdapter 事务同步适配器(抽象类)刚好加了一层使得我们可以跳过这样的全部接口的实现,只需要加入我们需要重写的方法即可
例如我只需要在事务提交之后执行某些方法,那么我就可以如下:
// 某一方法中
public void xxxServiceMethods(){
// 其他业务代码
......
......
......
// 某一段需要切入事务内实现的
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
// 重写需要加入到事务提交之后执行方法
@Override
public void afterCommit() {
// 需要加入到事务提交之后执行方法
.............
...........
...........
...........
...........
}
});
}