Postgres可序列化事务未按预期工作

时间:2020-03-31 07:00:51

标签: sql postgresql transactions

我在可序列化事务中运行以下代码(伪代码,JavaScript和SQL的混合):

BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE

const missions = select * from missions
if (missions.length) == 0 {
  insert into missions values (blah)
}

COMMIT

换句话说,我是:

  • 选择missions表中的所有行
  • 检查是否没有行(来自我的应用程序代码)
  • 如果没有行,则创建一行。

现在,当我并行运行上面的代码(例如10个线程)时,我最终看到创建了1行以上。鉴于我正在使用可序列化的事务,难道不是不可能创建多于一行的行吗?

此后,我将代码变成了单个查询,例如:

insert into missions
select * from possible-missions limit (1 - (select count(*) from missions))

哪个可以工作,但是我仍然不明白为什么我的原始代码无法按预期工作。

编辑:我已经创建了一个用于重现此问题的存储库:https://github.com/derekchiang/postgres-bug

1 个答案:

答案 0 :(得分:0)

事实证明,这是我使用的postgres驱动程序中的一个问题:它适用于pgpg-promise,但不适用于slonik(我正在使用的那个)。