postgres 中有没有一种方法可以锁定行,直到从同一系统执行下一个选择查询。还有一件事是锁定的行不会有更新过程。强> 场景是这样的
如果 table1 包含类似数据
id | txt
-------------------
1 | World
2 | Text
3 | Crawler
4 | Solution
5 | Nation
6 | Under
7 | Padding
8 | Settle
9 | Begin
10 | Large
11 | Someone
12 | Dance
如果sys1执行
select * from table1 order by id limit 5;
那么它应该为同时执行 select 语句的其他系统锁定 id 1 到 5 的行。
稍后,如果 sys1 再次执行另一个选择查询,例如
select * from table1 where id>10 order by id limit 5;
然后应该释放以前锁定的行。
最佳答案
我认为这是不可能的。您无法阻止对表的只读访问(除非完成该选择FOR UPDATE
)
据我所知,您唯一的机会是使用 pg_advisory_lock() 函数。
http://www.postgresql.org/docs/current/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS
但这需要“手动”释放通过它获得的锁。您不会因此获得自动解锁。
要锁定行,您需要这样的东西:
select pg_advisory_lock(id), * from ( select * table1 order by id limit 5 ) t
(请注意 LIMIT 部分使用派生表。有关说明,请参阅我发布的手动链接)
然后您需要存储检索到的 ID,并稍后为每个 ID 调用 pg_advisory_unlock()
。
如果每个进程总是同时释放所有 ID,您只需使用pg_advisory_unlock_all()
即可。那么您就不需要存储检索到的 ID。
请注意,这不会阻止其他人使用“正常”选择读取行。仅当访问该表的每个进程都使用相同的获取锁模式时它才有效。
关于postgresql - 锁定行直到下一次选择 postgres,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4573789/