首页 > 解决方案 > 如何使用spring确保数据库更新语句中没有竞争条件

问题描述

想象有两个实体ChildrenGifts。假设有 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 作为我的后端。

标签: javadatabasespringspring-bootconcurrency

解决方案


我不能发表评论,所以我去!

我假设您使用的是 Spring Data JPA。

然后你应该使用@Transactional注释:这意味着每次你请求你的数据库时,你都会做一个事务:

  1. 开始交易
  2. 执行交易
  3. 提交事务

很多关于此的有用信息(阅读它!):Spring @Transactional - 隔离,传播

您需要将事务隔离播种为可序列化,并可能更改传播方法。

如果你没有使用 Spring data JPA.. 那么有一个同步的关键字,但我认为在这里使用它有点糟糕。


推荐阅读