问题记录
问题记录:redisson分布式锁和@Transactional在并发场景中的Bug
详细描述:线程A抢占到线程B未提交事务但已释放的锁的,以及线程A读取到未提交的数据,导致线程A处理用户流水明细记录时,出现流水账目错误。
业务场景:房间内用户可以相互打赏礼物,在高频刷礼物的场景下,导致用户余额扣增错误
解决方法:
1、通过生产环境的日志进行原因分析
2、猜测可能出现的错误原因
- 事务隔离机制导致的释放锁后,事务未提交,导致读取到旧数据
- 其它线程把正在执行任务线程的锁给释放了
3、模拟生产环境的业务代码,进行场景还原
4、确定问题是因为抢到锁之后,读取到了未提交的事务数据,问题进行修改
问题解决方案
原业务逻辑伪代码:
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
public Action consume() {
//xxxx逻辑处理
Business giftShareAmountMessage = new Business();
serviceA.