当前位置:   article > 正文

TransactionSynchronizationManager 事务同步管理器 TransactionSynchronizationAdapter afterCommit 的用法

transactionsynchronizationadapter

TransactionSynchronizationManager 叫做事务同步管理器,可以在事务前后可以添加回调方法.
首先需要开启事务,在方法上添加@Transactional注解,否则回调方法不会被触发生效。

一、管理器方法

//获取当前事务名称; 事务名称=包名+类名+方法名

String currentTransactionName = TransactionSynchronizationManager.getCurrentTransactionName();
  • 1

//返回当前事务的隔离级别

Integer level = TransactionSynchronizationManager.getCurrentTransactionIsolationLevel();
  • 1

//返回当前线程所有已注册同步的不可修改快照列表

List<TransactionSynchronization> synchronizationsList = TransactionSynchronizationManager.getSynchronizations();
  • 1

//返回绑定到当前线程的所有事务对象。

Map<Object, Object> resourceMap = TransactionSynchronizationManager.getResourceMap();
  • 1
for (Map.Entry<Object, Object> item :resourceMap.entrySet()) {
    //检索key, 获取当前线程的事务
    Object resource = TransactionSynchronizationManager.getResource(item.getKey());

    //检索key, 获取当前线程是否存在事务
    boolean bool = TransactionSynchronizationManager.hasResource(item.getKey());
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

二、事务中的回调方法

常用的回调方法:
1.beforeCommit() 在事务提交之前调用
2.beforeCompletion(boolean readOnly) 在事务提交/回滚之前调用。
3.afterCommit() 在事务提交之后调用,当发生回滚时,afterCommit方法不会被执行
4.afterCompletion(int status) 在事务提交/回滚之后调用。
5.flush() 底层会话刷新到数据存储:例如,Hibernate/JPA会话。
6.resume() 恢复,将资源重新绑定
7.suspend() 暂停, 解除资源绑定
7.getOrder() 获取执行顺序,最低值的对象具有最高优先级

三、使用频率最高的回调afterCommit

首先方法上添加@Transactional注解

@Transactional(rollbackFor = Exception.class)
public void test(){
    //生成订单
    OrderEntity orderEntity = new OrderEntity();
    orderEntity.setStatus(1);
    //数据库新增保存
    orderServive.save(orderEntity);

    //商品使用数量+1
    GoodStockEntity goodStockEntity = new GoodStockEntity();
    goodStockEntity.setNum(1);
    //数据库更新保存
    goodStockServive.updateById(orderEntity);

    TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
        @Override
        public void afterCommit() {
            //订单发货处理;
            Long id = orderEntity.getId();
            //异步处理, 提高并发  示例:asyncComponent.orderHandle
            asyncComponent.orderHandle(id);
            
            //或者MQ消息处理
        }
    });
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
@Component
public class AsyncComponent {

    @Async
    public void orderHandle(Long orderId){
        OrderEntity orderEntity = orderServive.getById(orderId);
        if(orderEntity.getStatus().equals(1)){
            
        }

        if(orderEntity.getStatus().equals(2)){

        }

        if(orderEntity.getStatus().equals(3)){

        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

特别说明

1.在上面异步调用asyncComponent.orderHandle(id)时,为什么非得使用事务管理器的回调afterCommit,
因为事务提交可能会有延时,异步调用asyncComponent.orderHandle(id)比较快,可能导致查询orderServive.getById(orderId)的数据不是最新的,导致业务异常

2.另起线程异步处理中,重新查询了数据,都需要保证最新的,所以可以使用afterCommit处理
本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号