【问题标题】:Confused about the Mysql lock对Mysql锁感到困惑
【发布时间】:2014-02-25 03:11:19
【问题描述】:

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

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 来执行此操作:

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

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

我得到了错误:

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

这是有道理的,因为线程 A 在该行上放置了一个“X”锁。

然后我使用线程 B 来执行此操作:

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是读提交的。

【问题讨论】:

    标签: mysql transactions isolation-level


    【解决方案1】:

    wlq3 是数据库中的已提交值,因此事务 B 读取该值。 Jim 的更新尚未提交。锁不会阻止读取它只会阻止更新这是由于 InnoDB 中实现的 MVCC 锁定模型。

    查看此链接了解更多信息:InnoDB's row locking the same as MVCC Non-Blocking Reads?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-13
      • 2012-07-22
      • 2013-05-13
      • 2020-04-16
      相关资源
      最近更新 更多