繁体   English   中英

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

[英]Conflict on two PostgreSQL transactions with serializable isolation level

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

根据这里

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

或从 MSDN 关于 SET TRANSACTION ISOLATION LEVEL:

在数据集上放置一个范围锁,防止其他用户在事务完成之前更新或插入数据集。 这是四个隔离级别中限制最大的。 由于并发性较低,因此仅在必要时使用此选项。 此选项与在事务中的所有 SELECT 语句中的所有表上设置 HOLDLOCK 的效果相同。

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

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

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

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

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

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

SQL Server 文档显然不相关。

但是,是的,这看起来像是您应该报告的 PostgreSQL 错误。 但是请使用 SQL 脚本,而不是使用动画 GIF...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM