Что гарантирует блокировка на уровне таблицы? - PullRequest
1 голос
/ 12 июня 2011

У меня есть транзакция, которая выполняет одно чтение в базе данных, а затем одну запись.Если я выберу MyIsam в качестве своего механизма базы данных в MySQL, гарантирует ли механизм блокировки на уровне таблицы MyIsam, что, как только транзакция начинает читать, таблица блокируется от всех других транзакций?или больше транзакций, я хочу их в следующем порядке:

R W R W R W R W R W... 

Но если они выполняются в следующем порядке:

R R R R W W W W....

моя база данных переходит в несогласованное состояниеЭто конкретное требование в этой конкретной таблице.Достаточно ли сделать таблицу MYIsam?Если нет, что еще мне нужно сделать?Блокировка на уровне таблицы предназначена только для записи?

1 Ответ

2 голосов
/ 12 июня 2011

Документация MySQL гласит:

  • LOCK TABLES не безопасен для транзакций и неявно фиксирует любой активный транзакция перед попыткой блокировки таблицы.

  • Начало транзакции (например, с START TRANSACTION) неявно совершает любую текущую транзакцию и освобождает существующие блокировки.

Но эти условия применяются к транзакционному движку (InnoDB). MyISAM не поддерживает транзакции в стиле InnoDB.

MyISAM имеет блокировки чтения (которые будут предотвращать запись из любых сеансов) и блокировки записи (которые предотвращают чтение и запись из других сеансов). Несколько сеансов могут получить блокировки чтения, но если один сеанс получает блокировку записи, ни один другой сеанс не может читать, блокировать или записывать в таблицу, пока установлена ​​блокировка записи.

Я рекомендую вам ознакомиться с документацией по этой теме, а также с теми страницами, на которые есть ссылки в верхней части страницы, на которую я ссылаюсь. Извините, что ссылка ссылается на конкретный номер версии; Я не знаю независимого от версии способа ссылки на документацию MySQL.

Мне кажется, что вам нужно получить блокировку записи и выполнить чтение / запись, когда блокировка активна, затем отпустите ее и перейдите к следующему. Если вам нужно было сначала получить блокировку чтения, выполнить чтение, затем снять и получить блокировку записи, вы выставите условия гонки.

...