java - 如何使用spring确保数据库更新语句中没有竞争条件
问题描述
想象有两个实体Children
和Gifts
。假设有 1000 个孩子和 10 份礼物。孩子们总是会尝试抢夺可用的礼物,礼物将按照“先到先得”的原则贴上标签。
表结构
children
桌子
+----+------+
| id | name |
+----+------+
| 1 | Sam |
| 2 | John |
| 3 | Sara |
+----+------+
gift
桌子
+----+---------+-------------+
| id | gift | children_id |
+----+---------+-------------+
| 1 | Toy Car | 2 |
| 2 | Doll | 3 |
+----+---------+-------------+
这children_id
是第一个抢到礼物的孩子。
在我的应用程序中,我想以children_id
这样一种方式更新GiftUnavailableException
.
我将如何确保,即使一次有 1000 个请求来获取特定的礼物,也只有第一个会得到它。或者我将如何确保此更新没有竞争条件。
是否有任何我可以使用的弹簧特定功能或有任何其他方法。
我使用 spring-boot 作为我的后端。
解决方案
我不能发表评论,所以我去!
我假设您使用的是 Spring Data JPA。
然后你应该使用@Transactional
注释:这意味着每次你请求你的数据库时,你都会做一个事务:
- 开始交易
- 执行交易
- 提交事务
很多关于此的有用信息(阅读它!):Spring @Transactional - 隔离,传播
您需要将事务隔离播种为可序列化,并可能更改传播方法。
如果你没有使用 Spring data JPA.. 那么有一个同步的关键字,但我认为在这里使用它有点糟糕。
推荐阅读
- python - Keras:为什么`load_model`每次都变慢?
- java - Android Java - HttpURLConnection 失败而不抛出异常
- javascript - 关于 .push() 的 JavaScript
- intellij-idea - 在控制台中运行 HQL 查询
- java - (JFrame)如何读取随机数以不同的方法进行比较而不显示它?
- python - Centos 7 缺少 python-xml 包
- unity3d - 如何在 Unity 中翻转对撞机网格的法线
- java - 第二个活动怎么crash?
- visual-studio-code - 未找到配置文件
- c# - 使用 C# 从 Image 到 base64 的转换问题