想象一下,有两个实体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作为后端。
答案 0 :(得分:0)
我无法发表评论,所以我去!
我假设您正在使用Spring Data JPA。
然后,您应该使用@Transactional
批注:这意味着每次您请求数据库时,您都要进行事务处理:
有关此的许多有用信息(读它!):Spring @Transactional - isolation, propagation
您将需要将事务隔离种子设置为可序列化,并可能更改传播方法。
如果您不使用Spring数据JPA,那么可以使用同步关键字,但我认为在这里使用它有点麻烦。