#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-й транзакции. Да, каким-то образом это появляется прямо сейчас.
- Почему оператор INSERT создает блокировку X для вставленной строки? С какой целью? Где я могу получить информацию о таком поведении?
- Почему это произошло таким странным образом? Почему ВСТАВКА создала только блокировку IX, а блокировка X появилась позже?
Ответ №1:
Для любой базы данных нормально блокировать в эксклюзивном режиме (X) любую строку или страницу, которую она изменяет. Кроме того, ПРОЧИТАЙТЕ НЕЗАФИКСИРОВАННЫЕ ссылки для ВЫБОРА, ничего общего с INSERT . Чтобы снять блокировку, либо ЗАФИКСИРУЙТЕ, либо ОТКАТИТЕ первую транзакцию.