Совместимость блокировки MySQL

0

Согласно официальным документам отсюда:

матрица совместимости замков:

    X              IX          S         IS
X   Conflict    Conflict    Conflict    Conflict
IX  Conflict    Compatible  Conflict    Compatible
S   Conflict    Conflict    Compatible  Compatible
IS  Conflict    Compatible  Compatible  Compatible

В документах также говорится:

Таким образом, блокировки намерений не блокируют ничего, кроме полных запросов таблицы (например, LOCK TABLES... WRITE). Основная цель блокировок IX и IS - показать, что кто-то блокирует строку или блокирует строку в таблице.

Если намерение блокирует только блокировку полных запросов таблицы, то как объяснить конфликты IX с блокировкой S в вышеупомянутой матрице совместимости замков? Насколько я понимаю, S и X в матрице совместимости замков - это как блокировки записей, так и правильно?

Теги:
locking

1 ответ

0

Насколько я понимаю, S и X в матрице совместимости замков - это как блокировки записи, так и правильно?

Это правильно. Неправильно это предположение, что вы можете напрямую сравнивать блокировки таблиц и записей, которые документация, вероятно, не делает полностью ясными, а часть "Эти правила могут быть удобно суммированы с помощью следующей матрицы совместимости типа блокировки" может быть немного вводить в заблуждение, поскольку он не охватывает все (а именно, любую информацию о конфликтах S/X -table с блокировками записи).

Технически эта матрица определяет результат при проверке блокировок на каком-либо объекте, например, всякий раз, когда MySQL пытается добавить блокировку к чему-либо. Если вы попытаетесь получить блокировку S на таблице, она будет конфликтовать с блокировкой IX на этой таблице.

Если запись может иметь блокировку намерения, она тоже будет конфликтует. Просто потому, что блокируемый объект не использует блокировки намерений, не изменяет (общую) матрицу совместимости.

Технически внутренний тип данных для блокировок одинаковый для записей и таблиц, блокировки намерений никогда не устанавливаются для записей. Блокировка записи на самом деле никогда не будет сравниваться с блокировкой таблицы (так как это два разных объекта), и единственная причина, по которой блокировка записи мешает блокировке таблицы, - это протокол блокировки (для которого требуется блокировка как таблицы, так и записи заблокировать запись).

Таким образом, чтобы заблокировать запись, вам обычно потребуется различная блокировка таблицы. Матрица совместимости одна и та же, но значение таблицы может и обычно будет отличаться от значения записи.

Так

Таким образом, блокировки намерений не блокируют ничего, кроме полных запросов таблицы (например, LOCK TABLES... WRITE).

правильно, потому что только для полных запросов таблицы требуется блокировка, которая конфликтует с существующей блокировкой намерений, а записи не используют блокировки намерений. Но повторить это: вам все равно придется сравнивать буксировки различных замков. S -lock в записи не может конфликтовать с блокировкой на таблице, так как эти два объекта никогда не будут сравниваться.

В руководстве немного смешаны таблицы и блокировки записей. Он фактически определяет IS и IX как:

  • Intention shared (IS): транзакция T намерена установить S-блокировки для отдельных строк в таблице t.
  • Intention exclusive (IX): Transaction T намерена установить блокировки X на этих строках.

поэтому, если вы хотите, IS и IX в матрице могут быть несколько интерпретированы как свойства строк (которых они технически не являются), тогда как вы читаете их как блокировку в таблице (поскольку ее можно установить только для таблицы, но которая другой замок). Но матрица по-прежнему описывает ситуацию для сравнения записей (которые, вероятно, руководство недостаточно ясно) и не содержит никакой информации о совместимости с блокировкой таблицы S или X

Итак, чтобы подвести итог: вам не нужно "объяснять конфликты IX с S-блокировкой в вышеупомянутой матрице совместимости замков", поскольку это просто не охватывает эту ситуацию.

  • 0
    1. S и X блокируют только блокировку на уровне строк, либо они могут быть на уровне таблицы и на уровне строки. 2. Вы говорите, что это правильно для To my understanding, the S and X in the lock compatibility matrix are both record locks, it's that right? Итак, вы имеете в виду S и X блокировка на уровне строк в MySQL о матрице совместимости блокировок, верно? Потому что в моем посте Ватев сказал, что это блокировка на уровне таблицы в матрице совместимости блокировок, а вы сказали, что они здесь на уровне строк.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню