MySQL5.7.11,tx_isolation是可重复读的;
如下表所示:
CREATE TABLE a (
id int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
insert into a values(1);在session1中,像这样执行:
begin;
select * from a where id=2 for update;然后在session2中,执行:
begin;
insert into a values(3);session2被阻塞了,我认为session2被阻塞是因为间隙锁,但在information_schema.innodb_lock中,它显示了至上的伪记录和记录锁;
*************************** 1. row ***************************
lock_id: 234076:115:3:1
lock_trx_id: 234076
lock_mode: X
lock_type: RECORD
lock_table: `test`.`a`
lock_index: PRIMARY
lock_space: 115
lock_page: 3
lock_rec: 1
lock_data: supremum pseudo-record
*************************** 2. row ***************************
lock_id: 234075:115:3:1
lock_trx_id: 234075
lock_mode: X
lock_type: RECORD
lock_table: `test`.`a`
lock_index: PRIMARY
lock_space: 115
lock_page: 3
lock_rec: 1
lock_data: supremum pseudo-record
2 rows in set (0.00 sec)MySQL_Doc对此的描述如下:
For the last interval, the next-key lock locks the gap above the largest value in the index and the
“supremum” pseudo-record having a value higher than any value actually in the index. The supremum
is not a real index record, so, in effect, this next-key lock locks only the gap following the largest index
value.为什么是记录锁和lock_data是最高的伪记录?
发布于 2017-03-03 20:58:00
这个StackOverflow answer很清楚地解释了这一点。
基本上,如果没有下一个键可用,比如当您锁定一个位于表末尾的范围时,MySQL将使用pseudo-record,因为它不知道范围的结束位置。
在这种情况下,锁将阻止您在SQL查询WHERE子句中使用的谓词锁的边界之外添加条目。
https://stackoverflow.com/questions/36326846
复制相似问题