我的桌子:
mysql> select * from users;
+-----+---------+--------+
| id | name | locked |
+-----+---------+--------+
| 10 | 1010 | 0 |
| 11 | xxx | 0 |
| 888 | 888 | 0 |
| 890 | qqq | 0 |
| 891 | qqq | 0 |
+-----+---------+--------+
CREATE TABLE `NewTable` (
`id` int NOT NULL ,
`name` varchar(255) NULL ,
`locked` tinyint NULL DEFAULT 0 ,
PRIMARY KEY (`id`)
);
事务1(在终端1中运行):
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from users where name="qqq" and locked <>1 limit 1 for update;
+-----+------+--------+
| id | name | locked |
+-----+------+--------+
| 891 | qqq | 0 |
+-----+------+--------+
1 row in set (0.00 sec)
mysql>
在查询上运行explain:
事务2(在终端2中运行):
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from users where name="xxx" and locked <>1 limit 1 for update;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql>
我使用的是REPEATABLE-READ
隔离级别。据我所知,第一个事务中select返回的行将被锁定,直到发出提交。然而,为什么我在2事务中的选择被阻塞,等待第一个事务结束,尽管我正在搜索一个不同的名称?!
发布于 2014-07-17 02:15:52
如果没有看到表的DDL,我就不能肯定地说。但是,我猜您的第二个select正在尝试执行一个完整的表扫描,以便应用where子句。您正在搜索的列是否包含在索引或主键中?如果不是,那么MySQL无法在运行第二个查询时知道在第一个查询中返回的行中是什么。据它所知,它可能是匹配的,应该返回。
https://stackoverflow.com/questions/24793674
复制相似问题