原子更新以增加 Postgresql 中的整数
Atomic UPDATE to increment integer in Postgresql
我想弄清楚下面的查询是否可以安全地用于以下场景:
我需要生成无间隙的序号。因为我需要跟踪其中的许多,所以我有一个 table 保存序列记录,带有一个序列整数列。
为了获得下一个序列,我将触发下面的 SQL 语句。
WITH updated AS (
UPDATE sequences SET sequence = sequence + ?
WHERE sequence_id = ? RETURNING sequence
)
SELECT * FROM updated;
我的问题是:当多个用户在没有显式启动事务的情况下同时在数据库中触发此查询时,下面的查询是否安全?
注意:第一个参数通常为1,但也可以为10,例如得到10个新序号的区块
是的,那是安全的。
虽然其中一个语句是 运行,但所有其他此类语句都被锁阻塞。事务完成后将释放锁,因此请保持事务简短。另一方面,您需要保持事务处于打开状态,直到完成所有工作,否则您的序列可能会出现空白。
这就是为什么要求无间隙序列通常被认为是一个坏主意的原因。
除非我误解了这个问题,否则这就是 SERIAL 数据类型的用途:
https://www.postgresql.org/docs/8.1/static/datatype.html#DATATYPE-SERIAL
我想弄清楚下面的查询是否可以安全地用于以下场景:
我需要生成无间隙的序号。因为我需要跟踪其中的许多,所以我有一个 table 保存序列记录,带有一个序列整数列。
为了获得下一个序列,我将触发下面的 SQL 语句。
WITH updated AS (
UPDATE sequences SET sequence = sequence + ?
WHERE sequence_id = ? RETURNING sequence
)
SELECT * FROM updated;
我的问题是:当多个用户在没有显式启动事务的情况下同时在数据库中触发此查询时,下面的查询是否安全?
注意:第一个参数通常为1,但也可以为10,例如得到10个新序号的区块
是的,那是安全的。
虽然其中一个语句是 运行,但所有其他此类语句都被锁阻塞。事务完成后将释放锁,因此请保持事务简短。另一方面,您需要保持事务处于打开状态,直到完成所有工作,否则您的序列可能会出现空白。
这就是为什么要求无间隙序列通常被认为是一个坏主意的原因。
除非我误解了这个问题,否则这就是 SERIAL 数据类型的用途:
https://www.postgresql.org/docs/8.1/static/datatype.html#DATATYPE-SERIAL