**同一个方法里异步线程需要使用更新后数据需手动提交事务(MVCC机制)**

平时Spring使用最多的事务控制如下

// An highlighted block
@Transactional(rollbackFor = Exception.class)

MVCC机制:
同一个事务提交前,不论对数据库做多少变更,在本事务中查到的皆为进入方法前数据库中的结果。
然而,业务中有些同一方法里需要使用更新数据库后的场景。
伪代码如下:

// An highlighted block
public void a(){
	//更新语句1
	updateMapper.update(Object object)
	//查询语句2
	select(object)
}

当查询语句2需要语句1的结果时,需要手动提交,spring自带事务控制无效

// An highlighted block
    @Resource
    PlatformTransactionManager platformTransactionManager;
    @Autowired
    TransactionDefinition transactionDefinition;   
public void a(){
//开启事务
   TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
	try {
		//更新语句1
		updateMapper.update(Object object)
	 	//提交事务
        platformTransactionManager.commit(transactionStatus);
     }catch (Exception e){
            //回滚事务
        platformTransactionManager.rollback(transactionStatus);
        throw new CustomException(ReturnCode.FAIL_UPDATE);
        }
	//查询语句2
	select(object)
}

情景2:
当查询语句处为异步方法业务会发生如何场景:
经试验,事务使用@Transactional(rollbackFor = Exception.class)
异步使用 @Async(“taskExecutor”)
更新后进入3条线程查询方法结果分别为:
线程1:更新语句1前结果
线程2:更新语句1后结果
线程3: 更新语句1前结果

综上:不论同步还是异步需要使用更新后结果必须手动提交事务。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值