首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RR下mysql innodb引擎next-key锁问题

RR下mysql innodb引擎next-key锁问题
EN

Stack Overflow用户
提问于 2019-12-02 20:21:39
回答 1查看 71关注 0票数 1

当我学习mysql innodb引擎next-key lock (在Reapeatable Read级别下)时,我遇到了一个问题。

这是我的表结构和表数据。

代码语言:javascript
复制
CREATE TABLE `o` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `a` int(10) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `idx_a` (`a`)
    ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8

    +----+------+
    | id | a    |
    +----+------+
    |  1 |    1 |
    |  3 |    1 |
    |  5 |    3 |
    |  7 |    6 |
    | 10 |    8 |
    +----+------+

我在字段a中添加了一个普通索引,然后插入一些数据。我启动第一个事务(我们称为trx1)并运行以下命令:

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

mysql> select * from o where a=3 for update;
+----+------+
| id | a    |
+----+------+
|  5 |    3 |
+----+------+
1 row in set (0.00 sec)

我认为当我运行select * from o where a=3 for update时,mysql会根据next-key机制锁定(1,3],(3,6)。接下来,我启动第二个事务(我们称为trx2)并运行以下命令:

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

mysql> select * from o where a=5 for update;
Empty set (0.12 sec)

让我惊讶的是为什么trx2会执行命令select * from o where a=5 for update successfully.Because我认为trx1已经锁定了5并且trx2会阻塞直到trx1提交。

如果有人能替我回答,我将不胜感激!

EN

回答 1

Stack Overflow用户

发布于 2019-12-14 10:16:50

经过几天的学习,我终于解决了这个问题。trx1:select * from o where a=3 for update;将使用间隙锁锁定(1,6)。trx2:select * from o where a=5 for update;将使用间隙锁定锁定(3,6)。间隙锁与间隙锁兼容!这样trx2就不会阻塞了。

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

https://stackoverflow.com/questions/59138844

复制
相关文章

相似问题

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