TransactionSynchronizationManager 事务同步管理器使用场景 将某一动作或异步线程动作放到主线程事务提交之后执行 方法

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() {
            // 需要加入到事务提交之后执行方法
            .............
            ...........
            ...........
            ...........
            ...........

            }
        });

}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线程异步操回滚事务可以通过使用`@Transactional`注解和`TransactionSynchronizationManager`类来实现。具体步骤如下: 1.在异步方法上添加`@Transactional(rollbackFor = Exception.class)`注解,表示该方法需要进行事务管理,并且在出现异常时需要回滚事务。 2.在同步方法中调用异步方法时,使用`TransactionSynchronizationManager.registerSynchronization()`方法注册一个事务同步,该同步会在事务提交或回滚时被调用。 3.在事务同步中调用`TransactionSynchronizationManager.isActualTransactionActive()`方法判断当前是否有活动的事务,如果有,则调用`TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()`方法事务标记为回滚状态。 下面是一个示例代码: ```java @Service public class MyService { @Autowired private MyAsyncService myAsyncService; @Transactional(rollbackFor = Exception.class) public void doSomething() { // 业务代码... try { // 数据库操... } catch (Exception e) { // 调用异步方法完成数据库操 myAsyncService.doSomethingAsync(); // 注册一个事务同步 TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() { @Override public void afterCompletion(int status) { // 判断当前是否有活动的事务 if (TransactionSynchronizationManager.isActualTransactionActive()) { // 将事务标记为回滚状态 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } } }); } } } @Service public class MyAsyncService { @Async @Transactional(rollbackFor = Exception.class) public void doSomethingAsync() { // 异步方法业务代码... try { // 异步方法数据库操... } catch (Exception e) { // 抛出异常,事务会自动回滚 throw new RuntimeException(e); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值