TransactionSynchronizationManager 事务同步管理器 TransactionSynchronizationAdapter afterCommit 的用法
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
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13