PostgreSQL中SELECT ... FOR UPDATE是否阻塞同条件新插入行?
PostgreSQL SELECT ... FOR UPDATE 对新插入行的阻塞问题
首先要纠正一点:你给出的示例SELECT语句没有加上FOR UPDATE子句,实际要对查询到的行加排他锁,需要写成:
SELECT * FROM my_table WHERE parent_id = 5 FOR UPDATE; UPDATE my_table SET created = null WHERE parent_id = 5;
针对你的问题:
SELECT ... FOR UPDATE只会锁定执行查询时已经存在的、满足parent_id=5条件的行,这些被锁定的行会阻塞其他事务对它们的更新、删除操作。- 对于之后插入的
parent_id=5的新行,这个锁不会产生任何阻塞效果,新行可以正常插入。
如果需要阻止事务期间插入parent_id=5的新行,仅靠行级锁做不到,你需要额外添加表级锁(比如LOCK TABLE my_table IN EXCLUSIVE MODE;)或者通过其他业务逻辑限制。
内容的提问来源于stack exchange,提问作者user2880391
相关产品推荐
相关产品推荐

