Х-блокировки InnoDB на уровне изоляции READ COMMITTED - PullRequest
0 голосов
/ 25 января 2019

Из глоссария MySQL:

READ COMMITTED

Когда транзакция с этим уровнем изоляции выполняет операции UPDATE ... WHERE или DELETE ... WHERE, другие транзакциивозможно, придется подождать .Транзакция может выполнять операции SELECT ... FOR UPDATE и LOCK IN SHARE MODE , не заставляя другие транзакции ждать .

Это правильно?

UPDATE устанавливаетx-блокирует каждую сканируемую строку, а затем освобождает те блокировки, которые не соответствуют WHERE-части.Оставшиеся строки сохраняют х-блокировки до завершения транзакции.Насколько я знаю, точно так же происходит и с SELECT-FOR UPDATE.Так как же так, что UPDATE может блокировать другие транзакции, а SELECT-FOR UPDATE - нет?

1 Ответ

0 голосов
/ 25 января 2019

Глоссарий не является точным.

SELECT FOR UPDATE получает X-замок, как UPDATE. В обоих случаях другие транзакции, требующие блокировки любого типа, должны ждать.

SELECT FOR SHARE (или LOCK IN SHARE MODE) приобретает S-замок. Другие транзакции, которым требуются S-блокировки, могут получить их, но другие транзакции, которым нужны X-блокировки, должны ждать.

Уровень изоляции транзакции имеет мало общего с необходимыми блокировками, за исключением того, что некоторые типы блокировок пробела не нужны, когда ваша транзакция использует READ-COMMITTED.

Кажется, глоссарием немного пренебрегают. Лучше читать https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html и https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html

...