• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

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

武飞扬头像
预立科技
帮助1

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

一、管理器方法

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

String currentTransactionName = TransactionSynchronizationManager.getCurrentTransactionName();

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

Integer level = TransactionSynchronizationManager.getCurrentTransactionIsolationLevel();

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

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

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

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

    //检索key, 获取当前线程是否存在事务
    boolean bool = TransactionSynchronizationManager.hasResource(item.getKey());
}

二、事务中的回调方法

常用的回调方法:
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消息处理
        }
    });
}
@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.在上面异步调用asyncComponent.orderHandle(id)时,为什么非得使用事务管理器的回调afterCommit,
因为事务提交可能会有延时,异步调用asyncComponent.orderHandle(id)比较快,可能导致查询orderServive.getById(orderId)的数据不是最新的,导致业务异常

2.另起线程异步处理中,重新查询了数据,都需要保证最新的,所以可以使用afterCommit处理

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgkjahi
系列文章
更多 icon
同类精品
更多 icon
继续加载