【发布时间】:2021-06-15 03:09:28
【问题描述】:
我们有简单的表格:
CREATE TABLE t1 (
c1 INT UNSIGNED NOT NULL AUTO_INCREMENT,
c2 INT,
PRIMARY KEY (c1)
)
ENGINE=INNODB
第一次交易:
set transaction isolation level read uncommitted;
start transaction;
insert into t1 set c2 = 1;
由于某种原因,INSERT 在 t1 表上创建了 IX 锁。我预计没有锁。尤其是我没想到只有 IX 锁,而某行没有 X 锁。
第二次交易:
set transaction isolation level read uncommitted;
start transaction;
update t1 set c2 = 2 where c1 = 1;
这里的 UPDATE 语句在表 t1 上创建 IX 锁,并在更新的行上创建 X 锁。正如我在读取未提交的隔离级别中所期望的那样。但是这个 X 锁正在等待属于第一个事务的 X 锁。是的,不知怎的,它现在就出现了。
- 为什么 INSERT 语句在插入的行上创建 X 锁?什么目的?我在哪里可以获得有关此类行为的信息?
- 为什么会以这种奇怪的方式发生?为什么 INSERT 只创建了 IX 锁,而后来出现了 X 锁?
【问题讨论】:
标签: mysql sql database transactions locking