Останавливает ли транзакция все проблемы состояния гонки в MySQL? - PullRequest
6 голосов
/ 11 мая 2010

Рассмотрим эту ситуацию:

  1. Начать транзакцию
  2. Вставить 20 записей в таблицу с ключом auto_increment
  3. Получить первый идентификатор вставки (скажем, это 153)
  4. Обновить все записи в этой таблице, где id >= 153
  5. Commit

Является ли шаг 4 безопасным?

То есть, если другой запрос поступает почти точно в то же время и вставляет еще 20 записей после шага 2 выше, но перед шагом 4, будет ли состояние гонки?

Ответы [ 2 ]

6 голосов
/ 11 мая 2010

То есть, если другой запрос поступает почти точно в то же время и вставляет еще 20 записей после шага 2, описанного выше, но перед шагом 4, будет ли состояние гонки?

Да, будет.

Записи 21 до 40 будут заблокированы транзакцией 2.

Транзакция 1 будет заблокирована и будет ждать, пока транзакция 2 не завершится или не откатится.

Если транзакция 2 фиксируется, то транзакция 1 обновит 40 записей (включая записи, вставленные транзакцией 2)

0 голосов
/ 30 августа 2013

Я не думаю, что это может быть занесено в каталог как состояние гонки, а скорее как специфическое поведение DMBS. По сути, если СУБД блокирует вновь вставленные записи, то первая транзакция не увидит записи второй, пока вторая транзакция не будет зафиксирована.

И, конечно, существует проблема блокировки таблицы: если первая транзакция блокирует запись таблицы, то вторая будет заблокирована при записи, пока первая не завершится. Не уверен, хотя, если стандартный MySQL предлагает такую ​​функцию. Я знаю, что сервер MSSQL это делает.

...