Spring事务Transaction和synchronized冲突问题
问题
在做一个抽奖功能的时候,测试在高并发下发现用户的中奖记录和所限制的最大中奖数量不一致。
开始以为只是一个简单的并发问题,于是给接口加上了synchronized。打脸的是问题根本没有解决。
最后发现是因为接口上synchronized和@Transaction出现了冲突导致的问题
原因
因为synchronized代码块执行是在事务之内执行的,可以推断在代码块执行完时,事务还未提交,其他线程进入synchronized代码块后,读取的库存数据不是最新的,造成了脏读
解决方案
不要将@Transactional和synchronized用在一个方法上,而是新建一个被synchronized修饰的方法调用被@Transactional调用的方法。
示例如下:
@Transactional
public void example() {
// 示例
}
pu
版权声明:
作者:lichengxin
链接:https://www.techfm.club/p/14183.html
来源:TechFM
文章版权归作者所有,未经允许请勿转载。
THE END
二维码
共有 0 条评论