首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >选择update是锁定整个表还是只锁定返回的行?

选择update是锁定整个表还是只锁定返回的行?
EN

Stack Overflow用户
提问于 2014-07-17 01:55:37
回答 1查看 2.9K关注 0票数 1

我的桌子:

代码语言:javascript
运行
复制
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中运行):

代码语言:javascript
运行
复制
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中运行):

代码语言:javascript
运行
复制
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事务中的选择被阻塞,等待第一个事务结束,尽管我正在搜索一个不同的名称?!

EN

回答 1

Stack Overflow用户

发布于 2014-07-17 02:15:52

如果没有看到表的DDL,我就不能肯定地说。但是,我猜您的第二个select正在尝试执行一个完整的表扫描,以便应用where子句。您正在搜索的列是否包含在索引或主键中?如果不是,那么MySQL无法在运行第二个查询时知道在第一个查询中返回的行中是什么。据它所知,它可能是匹配的,应该返回。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24793674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档