Postgresql 选择“锁定不工作时的查询”

Postgresql 选择“锁定不工作时的查询”,postgresql,postgresql-9.1,Postgresql,Postgresql 9.1,我试图从带有锁的表中读取一行,以便其他人无法对该表执行任何读取操作 这是我在psql控制台上运行的查询,睡眠时间30秒 select * from TABLE_NAME for update; SELECT pg_sleep(30); 我还尝试了nowait: select * from TABLE_NAME for update nowait; SELECT pg_sleep(30); 出于测试目的,我的表只有一行,因此此处不需要条件 现在,从另一个psql控制台,我正在同一张表上执行se

我试图从带有锁的表中读取一行,以便其他人无法对该表执行任何读取操作

这是我在
psql
控制台上运行的查询,睡眠时间
30秒

select * from TABLE_NAME for update; SELECT pg_sleep(30);
我还尝试了
nowait

select * from TABLE_NAME for update nowait; SELECT pg_sleep(30);
出于测试目的,我的表只有一行,因此此处不需要条件

现在,从另一个
psql
控制台,我正在同一张表上执行
select
操作(在30秒内),但我仍然能够读取记录


我的问题是,为什么这个锁定不起作用?或者这不是正确的方法?有人能给我一点指导吗?

问题是,您的
选择更新
应该包装在事务中才能生效

psql
中的单行中键入此内容时:

select * from TABLE_NAME for update; SELECT pg_sleep(30);
它被分解为两个分别执行的sql语句,因此在
pgu sleep
甚至开始之前,UPDATE的
锁定效果就消失了

尝试:

在另一届会议上:

select * from TABLE_NAME for update;

查看第二个会话被阻止30秒。

您锁定它是为了更新,不是为了读取。尝试更新它。@ClodoaldoNeto我用过,它正在更新。基本上,我想防止别人阅读
。但是出于这个测试目的,对任何类型的操作进行锁定都可以。除非锁定完整的表(使用
ACCESS EXCLUSIVE
mode)@a_horse_和\u no_name,否则无法阻止读取请求。我只想模拟锁定。例如,我将从一个控制台启用锁定30秒,并希望从另一个控制台获取该锁定的错误。有什么办法吗?如果它使用的是
ACCESS EXCLUSIVE
模式,我对它没有问题。这意味着什么,你想模拟锁定?您是想了解PostgreSQL中的锁定是如何工作的,还是希望实现特定的用户可见锁定需求?您是对的。您的
开始
结束
解决了它。
select * from TABLE_NAME for update;