【发布时间】:2016-07-19 20:58:02
【问题描述】:
我被这个困住了。为了简单起见,假设我有这张桌子
CREATE TABLE IF NOT EXISTS `tbl_bags_oranges` (
`idbag` int(11) NOT NULL AUTO_INCREMENT,
`n_oranges` int(11) NOT NULL,
PRIMARY KEY (`idbag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci AUTO_INCREMENT=1 ;
我正在开发一个 php 脚本来代表用户抢橘子的情况。这就是我正在做的:
- 我使用
SELECT检查给定的 idgab 中是否有橘子 (n_oranges > 0) - 如果是这样,我
UPDATE将表格减去 1 到 n_oranges
但是当袋子里只有一个橙子时,可能会发生以下情况:
- 用户 A 想要拿一个橙子。 'SELECT' 表示只有一个橙色。
- 用户 B 想要拿一个橙子。 'SELECT' 表示只有一个橙色。
- 用户 A 拿起橘子。我
UPDATE表,现在 n_oranges = 0。 - 用户 B 能够抢到橙子,因为他的
SELECT说有一个橙子。
我该如何解决这个问题?交易? LOCK TABLES?由于我无法检查这种情况,因此无法知道我做得好还是坏。
【问题讨论】:
-
做一个intention lock。你的会有点相似,但会有所减少。瞬间,安全。
-
您是否尝试在一步更新之前再次添加检查 n_oranges?
标签: php mysql concurrency