首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对Mysql锁感到困惑

问对Mysql锁感到困惑
EN

Stack Overflow用户
提问于 2014-02-25 03:11:19
回答 1查看 56关注 0票数 0

我有一个关于MySQL InnoDB的问题。例如:我有线程A来启动事务:

代码语言:javascript
复制
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> update user set name = "Jim" where id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

然后,我就让线程A保持原样。我启动了另一个线程B来这样做:

代码语言:javascript
复制
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> update user set name = "Tom" where id = 1;

我得到了错误:

代码语言:javascript
复制
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

这是有意义的,因为线程A在该行上放置了一个'X‘锁。

然后我用线程B来做这个:

代码语言:javascript
复制
mysql> start transaction;
Query OK, 0 rows affected (0.01 sec)

mysql> select * from user where id = 1;
+----+------+
| id | name |
+----+------+
|  1 | wlq3 |
+----+------+
1 row in set (0.00 sec)

在这里我很困惑。就像我刚才说的,线程A在那一行上加了一个“X”锁。为什么线程B可以读取这一行。在我看来,读取数据需要共享锁,但是排他锁已经在该数据上了。有人能帮我吗,谢谢!

顺便说一下,线程A的隔离级别是可重复读取的,线程B是提交的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-25 05:38:06

wlq3是数据库中提交的值,所以事务B读取这个值。Jim的更新还没有提交,锁不会阻止读取,只会阻止更新,这是由于在InnoDB中实现的MVCC锁定模型。

有关更多信息,请参见此链接:InnoDB's row locking the same as MVCC Non-Blocking Reads?

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

https://stackoverflow.com/questions/22003822

复制
相关文章

相似问题

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