选择锁定无效的查询

时间:2014-03-31 13:03:32

标签: postgresql postgresql-9.1

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

这是我的查询,我正在psql控制台运行,30 seconds睡眠。

select * from TABLE_NAME for update; SELECT pg_sleep(30);

我也试过nowait

select * from TABLE_NAME for update nowait; SELECT pg_sleep(30);

我的表格有only one row用于测试目的,因此这里不需要条件。

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

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

1 个答案:

答案 0 :(得分:1)

问题是您的SELECT FOR UPDATE应该包含在交易中才有效。

psql

中的单行中输入此内容时
select * from TABLE_NAME for update; SELECT pg_sleep(30);

它被分解为两个单独执行的sql语句,因此在FOR UPDATE开始之前pg_sleep的锁定效果会丢失。

尝试:

 BEGIN; select * from TABLE_NAME for update; SELECT pg_sleep(30); END;

在另一个会话中:

select * from TABLE_NAME for update;

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