【发布时间】:2018-11-16 10:26:03
【问题描述】:
我正在阅读PostgreSQL Manual的第13.2节,但发现那里的文字描述不够清晰,缺乏示例。
例如以下两段不清楚谁在学习PostgreSQL:
带有 ON CONFLICT DO UPDATE 子句的 INSERT 行为类似。在读 提交模式,建议插入的每一行都将插入或更新。 除非存在不相关的错误,否则可以保证这两种结果之一。如果 冲突源于另一笔交易,其影响尚不可见 对于 INSERT,UPDATE 子句将影响该行,即使可能 该行的任何版本通常对命令是不可见的。"
和
Repeatable Read 模式提供了严格的保证每个事务 看到一个完全稳定的数据库视图。但是,这种观点不一定总是与同一级别的并发事务的某些串行(一次一个)执行一致。例如,即使是此级别的只读事务,也可能会看到更新的控制记录以显示批次已完成,但看不到在逻辑上属于批次的详细记录之一,因为它读取了控制记录的较早版本.
有人可以举例说明这两段的内容吗?
有谁知道我在哪里可以找到关于 PostgreSQL 隔离级别行为的正式描述?我正在寻找这个,因为它是一个高级主题,我相信正式的描述将有助于阐明它是如何工作的,从而有助于避免事务之间的并发错误。
更新:我的另一个疑问是,当可序列化事务可以与其他隔离级别的其他事务同时运行时,如何处理数据库机制决定提交或中止它的方式?数据库是否决定可序列化事务的结果,就好像其他事务也使用可序列化隔离运行一样?
谢谢
更新 2:到目前为止,我发现的关于隔离级别的实现细节最好的是 PostgreSQL Wiki Serializable Page。
【问题讨论】:
-
我想知道为什么有两个建议可以结束这个问题。一个潜在的回应似乎对于清楚地理解这个如此重要的数据库编程主题非常有用。
-
我认为这个问题有两个问题:首先,异地链接形式的答案很可能在将来的某个时候中断;其次,尚不清楚答案中究竟需要哪些额外的细节——您发现不清楚的描述具体是什么,以及“正式描述”有何不同?
-
请注意,我所说的“问题”并不是说它没有有用,而是它不太适合本网站。如果您edit 将问题集中在两段之一(您可以随时针对另一段提出单独的问题),并解释您已经理解的部分,则请求解释和示例可能更适合这种格式.
-
@IMSoP 我根据您的 cmets 调整了我的问题,现在它更侧重于我希望更好地解释的示例,最好是附带 SQL。正式描述的请求现在被降为第二优先级,尽管我相信除了代码本身之外没有任何地方这样的描述:-(。请阅读我对“Laurenz Albe”的评论,了解我对两者的不理解段落。谢谢
-
我仍然对您认为“正式描述”的外观以及它如何适合本网站感到困惑。隔离级别本身在 ISO SQL 标准中是标准化的,因此那里将正式描述他们必须做出的保证。 Postgres 如何实现这些保证的确切细节,根据定义,是一个实现细节,因此它们只会根据当前代码的细节被记录。
标签: postgresql transactions isolation-level