欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

**同一个方法里异步线程需要使用更新后数据需手动提交事务(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前结果

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

相关标签: java mvcc