Работает ли блокировка строк «для обновления» и для объединенных таблиц? - PullRequest
9 голосов
/ 08 сентября 2011

Я делаю 2 запроса в транзакции: SELECT (содержащий предложение JOIN) и UPDATE.Требуется, чтобы данные в выбранных строках не изменялись до завершения обновления, поэтому я использую предложение FOR UPDATE.Мой вопрос: работает ли «для обновления» только для части данных, выбранных из таблицы, указанной в предложении FROM, или для данных из объединенных таблиц?Моя СУБД MySql.

1 Ответ

6 голосов
/ 08 сентября 2011

Документация просто говорит о том, что блокировка для строк читается без исключений из объединенных таблиц, поэтому она должна быть для всех записей во всех объединенных таблицах. Если вы хотите заблокировать только строки в одной из таблиц, вы можете сделать это отдельно: «SELECT 1 FROM keytable WHERE ... FOR UPDATE».

Тем не менее, это не нужно, чтобы просто предотвратить обновление между SELECT и UPDATE. Блокировка чтения на SELECT уже делает это. Целью FOR UPDATE было бы предотвратить чтение строк другой транзакцией и, следовательно, потенциально вызвать взаимоблокировку, поскольку UPDATE нельзя применить, пока другая транзакция не снимет блокировку чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...