两个具有可序列化隔离级别的 PostgreSQL 事务发生冲突

Mah*_* Ne 3 sql postgresql transactions serializable

我有两个具有最严格隔离级别(可串行化)的并发 SQL 事务

根据这里

SQL 标准定义了四个级别的事务隔离。最严格的是可串行化,它是由标准中的一个段落定义的,该段落表示一组可串行化事务的任何并发执行都保证产生与按某种顺序一次运行一个事务相同的效果

但是您会看到在第二个事务的中间,表是空的。这怎么可能,我该如何解决它?

两个具有可序列化隔离级别的 Postgres 事务发生冲突

kli*_*lin 5

这是 Postgres 提供系统目录方式的结果。文档中的相关注释已经很清楚了:

对系统目录的内部访问不是使用当前事务的隔离级别来完成的。这意味着新创建的数据库对象(例如表)对于并发可重复读取和可序列化事务是可见的,即使它们包含的行不可见。

您提供的示例不会违反有关可序列化隔离级别的引用规则。请注意,当第一个事务删除并创建表时,您将启动第二个事务。结果行为符合预期。

如果您在删除表之前启动了两个事务,那么其中一个事务将被挂起,直到另一个事务完成。