Какой уровень блокировки / изоляции транзакции подходит для этой ситуации? - PullRequest
2 голосов
/ 20 июня 2011

Допустим, у меня есть ученик и школьный стол.Я выполняю одну операцию:

  • Удалить всех учеников, принадлежащих к школе
  • Изменить саму школу (возможно, изменить название или другое поле)
  • Добавьте обратно группу учеников

Я не обеспокоен этой ситуацией: два человека редактируют Школу / Студентов одновременно.Один представляет свои изменения.Вскоре после этого кто-то еще представляет свои изменения.Это не будет проблемой, поскольку в случае второго пользователя приложение заметит, что оно пытается перезаписать новую ревизию.

I am , обеспокоенный этим: кто-то открываетредактор для школ / учеников (который включает чтение из таблиц), в то же время выполняется транзакция, которая их модифицирует.

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

Ответы [ 2 ]

3 голосов
/ 20 июня 2011

Только в сериализуемом уровне изоляции MySQL не позволит вам читать строки, которые были изменены другой транзакцией. На любом более низком уровне изоляции вы увидите строки в состоянии, в котором они находились до запуска транзакции, которая их изменяет. Конечно, в READ_UNCOMITTED строки будут рассматриваться как удаленные / измененные, хотя транзакция не была завершена.

Если вы используете select для обновления,

0 голосов
/ 20 июня 2011

Вы можете использовать блокировку таблиц, чтобы предотвратить это. Проверьте this для получения дополнительной информации о таблицах блокировки

EDIT

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

...