我在可序列化事务中运行以下代码(伪代码,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
答案 0 :(得分:0)
事实证明,这是我使用的postgres驱动程序中的一个问题:它适用于pg
和pg-promise
,但不适用于slonik
(我正在使用的那个)。