我坚持这个。为了简化,让我说我有这个表
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 但如果袋子里只有一个橙子,可能会发生以下情况:
UPDATE
表,现在n_oranges = 0。SELECT
表示有一个橙色。我该如何解决这个问题?交易? LOCK TABLES
?由于我无法检查这种情况,因此无法知道我做得好不对。
答案 0 :(得分:0)
您可以在更新表格时进行检查:
UPDATE `tbl_bags_oranges`
SET n_oranges=n_oranges-1
WHERE n_oranges>=1;
您可以根据自己的情况修改代码。
答案 1 :(得分:0)
您可以使用locking reads。 详细说明:
START TRANSACTION
SELECT ... FROM tbl_bags_oranges WHERE ... FOR UPDATE
UPDATE tbl_bags_oranges SET ...
COMMIT
在这种情况下,在您的方案中,第二个查询将阻塞,直到第一个事务提交,因此不会发生竞争条件