Почему ВСТАВКА создает блокировку X

#mysql #sql #database #transactions #locking

#mysql #sql #База данных #транзакции #блокировка

Вопрос:

У нас есть простая таблица:

 CREATE TABLE t1 (
    c1 INT UNSIGNED NOT NULL AUTO_INCREMENT,
    c2 INT,
PRIMARY KEY (c1)
) 
ENGINE=INNODB
 

1-я транзакция:

 set transaction isolation level read uncommitted;
start transaction;
insert into t1 set c2 = 1;
 

По какой-то причине INSERT создает блокировку IX в таблице t1. Я не ожидал никаких блокировок. Особенно я не ожидал только IX блокировки, без блокировки X в какой-либо строке.

2-я транзакция:

 set transaction isolation level read uncommitted;
start transaction;
update t1 set c2 = 2 where c1 = 1; 
 

Здесь оператор UPDATE создает блокировку IX в таблице t1 и создает блокировку X в обновленной строке. Как я и ожидал, на уровне изоляции read uncommited. Но эта блокировка X ожидает блокировки X, которая принадлежит 1-й транзакции. Да, каким-то образом это появляется прямо сейчас.

  1. Почему оператор INSERT создает блокировку X для вставленной строки? С какой целью? Где я могу получить информацию о таком поведении?
  2. Почему это произошло таким странным образом? Почему ВСТАВКА создала только блокировку IX, а блокировка X появилась позже?

Ответ №1:

Для любой базы данных нормально блокировать в эксклюзивном режиме (X) любую строку или страницу, которую она изменяет. Кроме того, ПРОЧИТАЙТЕ НЕЗАФИКСИРОВАННЫЕ ссылки для ВЫБОРА, ничего общего с INSERT . Чтобы снять блокировку, либо ЗАФИКСИРУЙТЕ, либо ОТКАТИТЕ первую транзакцию.