【发布时间】:2011-02-02 04:43:50
【问题描述】:
我有一个关于 MySQL 锁定功能的奇怪问题(至少对我来说 :))。
我有一张桌子:
create table `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=latin1
有了这些数据:
+----+
|编号 |
+----+
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 10 |
| 11 |
| 12 |
+----+
现在我有 2 个客户端,这些命令在开始时执行:
设置自动提交=0;
设置会话事务隔离级别可序列化;
开始;
现在是最有趣的部分。第一个客户端执行此查询:(意图插入 id 等于 9 的行)
SELECT * from test where id = 9 FOR UPDATE;
空集(0.00 秒)
然后第二个客户端做同样的事情:
SELECT * from test where id = 9 FOR UPDATE;
空集(0.00 秒)
我的问题是:为什么第二个客户端不阻塞?第一个查询应该设置了独占间隙锁,因为已经使用了 FOR UPDATE 并且第二个客户端应该阻塞。
如果我错了,有人可以告诉我如何正确地做吗?
我使用的MySql版本是:5.1.37-1ubuntu5.1
【问题讨论】:
-
它不会阻塞,因为您已成功锁定 零 行。