我正在尝试从带有锁的表中读取一行,以便其他人无法对该表执行任何读取操作。
这是我的查询,我正在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秒内),但我仍然能够读取记录。
我的问题是,为什么这种锁定不起作用?或者它不是正确的方法吗?有人可以指导我一点吗?
答案 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秒。