Повторяемое чтение MySQL - PullRequest
0 голосов
/ 27 июня 2018

В Mysql с уровнем изоляции Repeatable по умолчанию,

В сеансе 1 транзакция 1,

start transaction;    
update student_details set name='uuu' where dept='mech';

Изменения были сделаны успешно. Здесь индексируется столбец «dept».

После этого в сеансе 2 транзакция 2,

start transaction;
update student_details set name='kkk' where dept='ece';

Здесь также были успешно внесены изменения.

Но если я сделаю то же самое без индексации столбца 'dept', то транзакция 2 в сеансе 2 ожидает, пока транзакция 1 в сеансе 1 не будет зафиксирована или произойдет откат.

Я знаю, что при повторяемом уровне изоляции при чтении, когда мы выполняем оператор «update ... where ...», каждая читаемая строка блокируется исключительной блокировкой (блокировкой записи). Поэтому транзакция 2 ожидания ждет пока 1 не снимает блокировку.

Итак, что же на самом деле происходит, когда мы индексируем столбец и делаем запрос 'update ... where ..'? почему то же самое не происходит с индексами ??

1 Ответ

0 голосов
/ 27 июня 2018

Блокировка чтения (выберите для обновления), UPDATE или DELETE обычно устанавливает блокировки записи для каждой индексной записи, которая сканируется при обработке оператора SQL. Неважно, есть ли в операторе условия WHERE, исключающие строку. InnoDB не помнит точное условие WHERE, а только знает, какие диапазоны индекса были отсканированы. Блокировки обычно являются блокировками следующего ключа, которые также блокируют вставки в «промежуток» непосредственно перед записью.

Как говорится MySQL документация.

Значение

если есть индекс, он запоминает индекс, следовательно, row level locking happens.

Если он не может найти индекс, может произойти диапазон lock on secondary indexes или full table locking.

Так что в вашем случае с индексом происходит блокировка на уровне строк, может продолжаться вторая транзакция. Но в случае, когда нет индекса, он блокирует другую транзакцию. Отсюда надо ждать.

...