我正在考虑使用“SELECT ... FOR UPDATE”在几行上运行一些更改。 例如-
Select * from my_table where parent_id = 5
Update my_table set created = null where parent_id = 5;
据我所知,它将阻止任何删除/更新 parent_id=5 行的请求。 我担心的是同时会发生什么情况,将请求创建一个新的 my_table 行,其中 parent_id=5。会不会被屏蔽?
行锁在调用
SELECT ... FOR UPDATE
时获取,因此插入新行不会被阻塞,即使它们符合锁定行的选择标准。这可以通过启动事务并执行 SELECT ... FOR UPDATE
轻松确认,然后在第二个会话中插入与选择条件匹配的新行并对新插入的行执行更新。两个操作都将完成。通过尝试从第二个会话中更新其中一个来确认最初选择的行仍然被锁定。该操作将挂起,直到第一个会话中的事务终止。