0

我是 Postgres 的新手(甚至是 SQL)。我正在构建一个密钥数据库,它有一个名为 Key 的表。我的问题是如何在 pg.

如果一个连接正在读取第一条记录,同时第二条连接进来,它应该读取第二条记录而不是第一条。第 3 次第 4 次也是如此,以此类推。

4

1 回答 1

1

您可以使用select for update. FOR UPDATE导致SELECT语句检索到的行被锁定,就像更新一样。这可以防止它们被其他事务锁定、修改或删除,直到当前事务结束。

注意力:

SELECT FOR UPDATE将等待已在同一行上运行任何这些命令的并发事务,然后将锁定并返回更新的行(或没有行,如果该行已被删除)

现在我将为您编写查询示例并解释如何执行此操作:假设我们有一个这样的表:

Table name: key_table

key     is_used
00001   true 
00002   true 
00003   false 
00004   false 
00005   false 

select key from key_table
where 
    is_used = false 
order by key desc
limit 1 for update
into v_key; 

update key_table
set
    is_used = true
where key = v_key;

命令后select选定的行将被锁定。在更新之前,用户不能在任何其他会话中选择此行。选择此行时,所有用户都将等待此更新。命令后update用户可以显示下一行 is_used = false

于 2022-02-06T09:58:34.643 回答