mysql 锁伪记录上确界究竟何时出现?

omjgkv6w  于 2023-01-08  发布在  Mysql
关注(0)|答案(1)|浏览(121)

我需要一个例子

对伪记录应用锁是什么意思?
https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html#innodb-next-key-locks
对于最后一个间隔,下一个关键字锁锁定索引中最大值以上差距以及值高于索引中任何实际值的**“上确界”伪记录**。上确界不是真实的的索引记录,因此,实际上,此下一个关键字锁仅锁定最大索引值之后的间隙。
下面是一个例子,但是:
Lock-data:supremum pseudo-record in MySQL5.7.11 with REPEATABLE-READ
我不明白这个问题的答案,它使我感到困惑,因为它是具有唯一索引的单个搜索条件

k97glaaz

k97glaaz1#

上确界锁是在间隙锁位于表末尾时创建的。也就是说,您的事务锁定了一个间隙,并且没有大于您请求的范围的现有记录。
在您链接到的示例中:
第一次会议:

CREATE TABLE a (
  id int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

insert into a values(1);

begin;
select * from a where id=2 for update;

在默认的事务隔离级别REPEATABLE-READ中,这将锁定一个从id = 2到无穷大的间隙,无穷大是上确界。
然后在会话2中:

begin;
insert into a values(3);
...waits...

会话1持有的间隙锁覆盖了从2到无穷大的所有内容,因此它阻止了id 3的插入。
然而,如果会话1的事务隔离级别为READ-COMMITTED,则它不会获得间隙锁。
第一次会议:

set transaction_isolation='READ-COMMITTED';

begin;
select * from a where id=2 for update;

第二次会议:

mysql> insert into a values(3);
Query OK, 1 row affected (0.00 sec)

相关问题