Pau*_*aul 5 postgresql concurrency multithreading race-condition transaction-isolation
我试图找出下面的查询是否可以安全地用于以下情况:
我需要生成序号,没有间隔。由于需要跟踪许多记录,因此我有一个表,其中包含序列记录和序列整数列。
为了获得下一个序列,我将触发下面的SQL语句。
WITH updated AS (
UPDATE sequences SET sequence = sequence + ?
WHERE sequence_id = ? RETURNING sequence
)
SELECT * FROM updated;
Run Code Online (Sandbox Code Playgroud)
我的问题是:当多个用户在不显式启动事务的情况下同时在数据库中触发此查询时,下面的查询是否安全?
注意:第一个参数通常为1,但也可以为10,例如,以获取10个新序列号的块
是的,那很安全。
当一个这样的语句运行时,所有其他这样的语句被锁定在一个锁上。交易完成后,该锁将被释放,因此请缩短交易时间。另一方面,在所有工作完成之前,您需要保持事务开放,否则可能会导致序列空白。
这就是为什么通常要求无缝序列是一个坏主意的原因。
| 归档时间: |
|
| 查看次数: |
4424 次 |
| 最近记录: |