Пожалуйста, помогите мне понять вариант использования SELECT ... FOR UPDATE
.
Вопрос 1: Является ли следующий пример хорошим примером того, когда следует использовать SELECT ... FOR UPDATE
?
Дано:
Приложение хочет получить список всех комнат и их меток, но должно отличать комнаты без меток от комнат, которые были удалены. Если ВЫБРАТЬ...FOR UPDATE не используется, что может произойти:
[id = 1]
[id = 1, name = 'cats']
[room_id = 1, tag_id = 1]
SELECT id FROM room;
возвращает [id = 1]
УДАЛИТЬ ИЗ room_tags WHERE room_id = 1;
УДАЛИТЬ ИЗ комнат, ГДЕ id = 1;
ВЫБЕРИТЕ tags.name ИЗ room_tags, tags WHERE room_tags.tag_id = 1 AND tags.id = room_tags.tag_id;
Теперь поток 1 считает, что у комнаты 1 нет тегов, но на самом деле комната была удалена. Чтобы решить эту проблему, поток 1 должен SELECT id FROM room FOR UPDATE
, тем самым предотвращая удаление потоком 2 из room
до тех пор, пока поток 1 не завершит работу. Это правильно?
Вопрос 2: Когда следует использовать SERIALIZABLE
изоляцию транзакций по сравнению с READ_COMMITTED
с SELECT ... FOR UPDATE
?
Ожидается, что ответы будут переносимыми (не зависят от базы данных). Если это невозможно, объясните, почему.