Пожалуйста, помогите мне понять сценарий использования SELECT ... FOR UPDATE
.
Вопрос 1. Является ли следующий хороший пример того, когда следует использовать SELECT ... FOR UPDATE
?
Данный:
- комнаты [id]
- теги [id, name]
- room_tags[room_id, tag_id]
- room_id and tag_id are foreign keys
Приложению требуется перечислить все комнаты и их теги, но необходимо различать комнаты без тегов и комнаты, которые были удалены. Если SELECT ... FOR UPDATE не используется, может произойти следующее:
- Initially:
- rooms contains
[id = 1]
- теги содержат
[id = 1, name = 'cats']
- room_tags содержит
[room_id = 1, tag_id = 1]
- rooms contains
- Thread 1:
SELECT id FROM rooms;
returns [id = 1]
- Тема 2:
DELETE FROM room_tags WHERE room_id = 1;
- Тема 2:
DELETE FROM rooms WHERE id = 1;
- Поток 2: [совершает транзакцию]
- Thread 1:
SELECT tags.name FROM room_tags, tags WHERE room_tags.room_id = 1 AND tags.id = room_tags.tag_id;
- returns an empty list
Теперь поток 1 думает, что у комнаты 1 нет тегов, но на самом деле комната была удалена. Чтобы решить эту проблему, поток 1 должен SELECT id FROM rooms FOR UPDATE
, тем самым предотвращая удаление потока 2 из rooms
до тех пор, пока поток 1 не будет завершен. Это верно?
Вопрос 2. Когда следует использовать SERIALIZABLE
изоляцию транзакций по сравнению с READ_COMMITTED
с SELECT ... FOR UPDATE
?
Ожидается, что ответы будут переносимы (не привязаны к базе данных). Если это невозможно, объясните, почему.
REPEATABLE_READ
иREAD_COMMITTED
даже переносные? Единственные результаты, которые я получаю для них, относятся к серверу MSSQL. - person Billy ONeal   schedule 07.05.2013READ COMMITTED
режима не определяет, действительно ли вы будете видеть записи, переданные другой транзакцией: это только гарантирует, что вы никогда не увидите незафиксированные записи. - person Quassnoi   schedule 07.05.2013select ... for update
наrooms
по-прежнему разрешает удалениеroom_tags
, потому что это отдельные таблицы. Вы хотели спросить, предотвратит ли предложениеfor update
удаление изrooms
? - person Chris Saxon   schedule 12.05.2013