mlj*_*jrg 5 postgresql transactions isolation-level
我正在阅读PostgreSQL 手册的第 13.2 节,但发现那里的文字描述不够清楚,并且缺少示例。
例如以下两段不清楚谁在学习 PostgreSQL:
带有 ON CONFLICT DO UPDATE 子句的 INSERT 行为类似。在 Read Committed 模式下,建议插入的每一行要么插入要么更新。除非存在不相关的错误,否则保证这两种结果之一。如果冲突源自另一个对 INSERT 尚不可见的事务,则 UPDATE 子句将影响该行,即使该行的常规版本可能对该命令不可见。”
和
可重复读取模式提供了严格的保证,每个事务都可以看到完全稳定的数据库视图。但是,此视图不一定总是与同一级别的并发事务的某些串行(一次一个)执行一致。例如,即使是此级别的只读事务也可能会看到更新的控制记录以显示批次已完成,但看不到逻辑上属于批次的详细记录之一,因为它读取了控制记录的较早版本.
有人可以举例说明这两段的内容吗?
有谁知道我在哪里可以找到 PostgreSQL 隔离级别行为的正式描述?我正在寻找这个,因为它是一个高级主题,我相信正式的描述将有助于阐明它的工作原理,从而有助于避免事务之间的并发错误。
更新:我的另一个疑问是,当一个可序列化的事务可以与其他隔离级别的其他事务同时运行时,它是如何根据数据库机器决定提交或中止它的方式来处理的?数据库是否决定可序列化事务的结果,就像其他事务也以可序列化隔离运行一样?
谢谢
更新 2:到目前为止,我发现的关于隔离级别的实现细节最好的是PostgreSQL Wiki Serializable Page。
READ COMMITTED:每条 SQL 语句都会获取数据库的新快照,因此每条语句在提交后始终会看到并发事务在同一时间内所做的更改。不会发生序列化错误。
REPEATABLE READ: 事务中的第一条语句获取为整个事务保留的数据库快照,因此所有语句都看到数据库的相同状态。如果您在拍摄快照后尝试修改已被并发事务修改的行,则可能会发生序列化错误。此隔离级别并不比READ COMMITTED.
SERIALIZABLE: 任何可能导致与事务的某些串行执行顺序不一致的结果的事务都将因序列化错误而被中止。可能存在误报。此隔离级别比其他隔离级别更昂贵。
对具体问题的回答:
INSERT ... ON CONFLICT 在读提交隔离中:
如果事务 1 已插入一行,但尚未提交,则正在运行的事务 2INSERT ... ON CONFLICT将等到事务 1 已提交或回滚,然后根据需要进行更新或插入。不会发生约束违反。
批处理作业和REPEATABLE READ:
这一段是黑暗的;忽略它。它试图说明两个并发的可重复读翻译可以产生与任何串行执行不一致的结果。
一个更好的例子可能是两个并发事务,它们都读取相同的数据并根据读取结果对它们执行更新。这些事务中的每一个都无法看到另一个事务的修改。
查看“可序列化”下的 PostgreSQL Wiki 以获取更详细的示例。
更新问题:
这个问题我不是很清楚。
可序列化事务采用特殊的“SI”锁来跟踪读写访问并在提交后继续存在。它们不会阻止其他会话,但用于确定是否可能存在冲突。仅当所有并发事务都使用可序列化隔离级别时,可序列化隔离级别才能正常工作。
| 归档时间: |
|
| 查看次数: |
2060 次 |
| 最近记录: |