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 秒内),但我仍然能够读取记录。
我的问题是,为什么这个锁定不起作用?或者这不是正确的方法?有人可以指导我一下吗?
问题是你的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 秒。
| 归档时间: |
|
| 查看次数: |
2919 次 |
| 最近记录: |