【发布时间】:2017-01-08 21:35:52
【问题描述】:
我们正在使用 MySQL InnoDB。系统支持可以同时发生的多个请求。 这是我们正在努力实现的目标的简化示例。 假设我们有一个表,其中包含代表灯泡的实体。用户可以打开(激活)这些灯泡。用户可以将灯泡添加到表中,这些灯泡最初是停用的,其中只有 10 个可以标记为已启用。所以我们有10个限制。由于系统支持并发,基于以下示例存在竞争条件的风险:
第 1 节:
1:获取活动灯泡的数量
2:查看激活灯泡的数量
3:如果尚未达到限制,请激活灯泡并提交。
4:否则回滚。
这里的问题是,在第 2 步和第 4 步期间,另一个会话可能进入并最终超出限制。
这是我们当前正在做的事情的 sql 表示:
- SELECT count(id) AS total FROM tbl WHERE is_active = 1;
- 如果(总数
- 激活另一个灯泡; } 其他 {
- 回滚; }
对于这种情况,您有什么建议作为解决方案? 我们正在考虑“选择更新”,但如果我没记错的话,锁定选定的行并且用户可以在选定的行处于锁定状态时将灯泡添加到表中。
谢谢。
【问题讨论】:
-
您需要“激活”灯泡还是什么都不做?注意甚至通知用户他不能再“激活”了? (感觉问题陈述不完整。)
标签: php mysql transactions innodb laravel-5.3