最佳答案
请帮助我理解 SELECT ... FOR UPDATE
背后的用例。
问题1 : 下面是否是应该使用 SELECT ... FOR UPDATE
的好例子?
给出:
应用程序希望列出所有房间及其标记,但需要区分没有标记的房间和已删除的房间。如果没有使用 SELECT... FOR UPDATE,可能发生的情况是:
[id = 1]
的房间[id = 1, name = 'cats']
[room_id = 1, tag_id = 1]
SELECT id FROM rooms;
returns [id = 1]
DELETE FROM room_tags WHERE room_id = 1;
DELETE FROM rooms WHERE id = 1;
SELECT tags.name FROM room_tags, tags WHERE room_tags.room_id = 1 AND tags.id = room_tags.tag_id;
现在线程1认为房间1没有标签,但实际上房间已被删除。为了解决这个问题,线程1应该使用 SELECT id FROM rooms FOR UPDATE
,从而防止线程2从 rooms
中删除,直到线程1完成。是这样吗?
问题2 强 > : 什么时候应该使用 SERIALIZABLE
事务隔离与使用 READ_COMMITTED
和 SELECT ... FOR UPDATE
?
答案应该是可移植的(不是特定于数据库的)。如果不可能,请解释原因。