【发布时间】:2019-11-15 10:08:48
【问题描述】:
我正在尝试了解如何锁定一行,然后才释放该锁定。
我有一张这样的桌子:
create table testTable (Name varchar(100));
一些测试数据
insert into testTable (name) select 'Bob';
insert into testTable (name) select 'John';
insert into testTable (name) select 'Steve';
现在,我想选择其中一行,并阻止其他查询看到这一行。我是这样实现的:
begin transaction;
select * from testTable where name = 'Bob' for update;
在另一个窗口中,我这样做:
select * from testTable for update skip locked;
太好了,我在该结果集中没有看到“Bob”。现在,我想对检索到的主要行 (Bob) 做一些事情,在我完成工作之后,我想再次释放该行。简单的答案是: 提交事务
但是,我在同一个连接上运行多个事务,所以我不能在整个节目中开始并提交事务。理想情况下,我希望进行“命名”交易,例如:
begin transaction 'myTransaction';
select * from testTable where name = 'Bob' for update;
//do stuff with the data, outside sql then later call ...
commit transaction 'myTransaction';
但是 postgres 不支持。我找到了“准备交易”,但这似乎是一条我不想走下去的梨形路径,尤其是这些交易似乎在重启后仍然存在。
我是否可以参考特定事务的提交/回滚?
【问题讨论】: