提问者:小点点

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


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

根据这里:

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

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


共2个答案

匿名用户

这是Postgres提供系统目录方式的结果。留档中的相关注释足够清楚:

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

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

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

匿名用户

SQL服务器留档显然不相关。

但是是的,这看起来像一个你应该报告的PostgreSQLbug。但是请使用SQL脚本,而不是动画GIF…