postgresql - 锁定行直到下一次选择 postgres

标签 postgresql select locking

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/

相关文章:

performance - 在SQLite中获取每个组的最后10行的有效方法

php - Symfony 通知 : unserialize(): Error at offset 36 of 40 bytes , 从 Mysql 迁移到 PostgreSQL

java - Flyway:clean 不清理多个模式

2张表的Mysql优化查询

多个服务器上的 Java 锁定

postgresql - 哪个显式锁用于触发器?

Mysql:查询这条sql :"select * from user limit 0,1000"时,是否允许删除操作

django - 当 Django 在 postgresql 中使用可序列化事务隔离级别时,哪些特定异常表示序列化失败?

sql - 在 PostgreSQL JOIN 查询中使用二进制逻辑

java - 如何使用 min() 函数在 sqlite 中指定查询