**同一个方法里异步线程需要使用更新后数据需手动提交事务(MVCC机制)**
程序员文章站
2022-06-14 18:57:17
...
平时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前结果
综上:不论同步还是异步需要使用更新后结果必须手动提交事务。
上一篇: Spring batch的自动运行
下一篇: 14.5.2.3 一致性非阻塞读