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;