选择带锁的查询不起作用

Sab*_*san 3 postgresql postgresql-9.1

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

这是我从带有睡眠psql状态的控制台运行的查询30 seconds

select * from TABLE_NAME for update; SELECT pg_sleep(30);
Run Code Online (Sandbox Code Playgroud)

我也尝试过nowait

select * from TABLE_NAME for update nowait; SELECT pg_sleep(30);
Run Code Online (Sandbox Code Playgroud)

我的表用于only one row测试目的,所以这里不需要条件。

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

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

Dan*_*ité 5

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

当在一行中输入此内容时psql

select * from TABLE_NAME for update; SELECT pg_sleep(30);
Run Code Online (Sandbox Code Playgroud)

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

尝试:

 BEGIN; select * from TABLE_NAME for update; SELECT pg_sleep(30); END;
Run Code Online (Sandbox Code Playgroud)

在另一场会议中:

select * from TABLE_NAME for update;
Run Code Online (Sandbox Code Playgroud)

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