如何使用Spring确保数据库更新语句中没有竞争条件

时间:2019-04-17 12:06:39

标签: java database spring spring-boot concurrency

想象一下,有两个实体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作为后端。

1 个答案:

答案 0 :(得分:0)

我无法发表评论,所以我去!

我假设您正在使用Spring Data JPA。

然后,您应该使用@Transactional批注:这意味着每次您请求数据库时,您都要进行事务处理:

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

有关此的许多有用信息(读它!):Spring @Transactional - isolation, propagation

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

如果您不使用Spring数据JPA,那么可以使用同步关键字,但我认为在这里使用它有点麻烦。