【问题标题】:Why INSERT creates X lock为什么 INSERT 创建 X 锁
【发布时间】: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 锁。是的,不知怎的,它现​​在就出现了。

  1. 为什么 INSERT 语句在插入的行上创建 X 锁?什么目的?我在哪里可以获得有关此类行为的信息?
  2. 为什么会以这种奇怪的方式发生?为什么 INSERT 只创建了 IX 锁,而后来出现了 X 锁?

【问题讨论】:

    标签: mysql sql database transactions locking


    【解决方案1】:

    任何数据库将其修改的任何行或页面锁定在独占模式 (X) 都是正常行为。此外,READ UNCOMMITTED 引用到 SELECT,与 INSERT 无关。 要释放锁,请提交或回滚第一个事务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-11
      • 1970-01-01
      • 2018-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多