栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring事务Transaction和synchronized冲突问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring事务Transaction和synchronized冲突问题

问题

在做一个抽奖功能的时候,测试在高并发下发现用户的中奖记录和所限制的最大中奖数量不一致。

开始以为只是一个简单的并发问题,于是给接口加上了synchronized。打脸的是问题根本没有解决。

最后发现是因为接口上synchronized和@Transaction出现了冲突导致的问题

原因

因为synchronized代码块执行是在事务之内执行的,可以推断在代码块执行完时,事务还未提交,其他线程进入synchronized代码块后,读取的库存数据不是最新的,造成了脏读

解决方案

  • 不要将@Transactional和synchronized用在一个方法上,而是新建一个被synchronized修饰的方法调用被@Transactional调用的方法。

示例如下:

@Transactional
public void example() {
    // 示例
}
public synchronized void example() {
    example();
}
  • 直接在把synchronized加在controller上,在service上使用@Transactional注解
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/697446.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号