赞
踩
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() 获取执行顺序,最低值的对象具有最高优先级
首先方法上添加@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)的数据不是最新的,导致业务异常
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。