PostgreSQL串行化隔离级别下的两个事务冲突

3
我有两个并发的SQL事务,采用最严格的隔离级别(可串行化)
根据这里所述:
SQL标准定义了四个事务隔离级别。最严格的是Serializable,在标准中被定义为一个段落,其中指出任何一组Serializable事务的并发执行都保证以某种顺序逐个运行时产生相同的效果。
但是你会发现在第二个事务的中间,表是空的。 这怎么可能,我该如何解决?

Conflict on two Postgres transactions with serializable isolation level


3
当你使用Postgres时,为什么要阅读SQL Server手册? - user330315
2个回答

5
这是由于Postgres提供系统目录的方式导致的。相关说明文档已经非常明确:
“使用当前事务的隔离级别不会访问系统目录的内部内容。这意味着,即使并发的可重复读和串行化事务可以看到新创建的数据库对象(如表),其中包含的行也并不是可见的。”
你提供的示例没有违反串行化隔离级别的规则。请注意,在第一个事务删除并创建表后,再开始第二个事务。结果是符合预期的。
如果您在表被删除之前启动了两个事务,则其中一个事务将被挂起,直到另一个完成为止。

非常准确!我正在寻找手册中的那个引用。 - Erwin Brandstetter

0

SQL Server 的文档显然与此无关。

但是,是的,那看起来像是一个 PostgreSQL 的 bug,你应该报告它。但请使用 SQL 脚本而不是动画 GIF...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接