【发布时间】:2019-04-17 12:06:38
【问题描述】:
假设有两个实体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 作为我的后端。
【问题讨论】:
-
如果您在一台机器上有多个线程,请使用
synchronized -
1.确保在事务中执行。 2. 首先对
Gift进行排他锁 - 比如@Lock(LockModeType.PESSIMISTIC_READ) Gift findOne(Long id)。 3. 一旦Gift被检索到,立即检查它是否未被认领。如果是,则退出(抛出异常、返回错误等)。 4. 如果礼物没有被认领,将认领人分配给它,并保存。这样,可以并行处理多个索赔,只要是针对不同的礼物,同时针对相同礼物的并发索赔将被拒绝,即使它们在不同的机器上运行。
标签: java database spring spring-boot concurrency