我正在阅读PostgreSQL Manual的13.2节,但发现的文字描述不够清楚,并且缺少示例。
例如,以下两段内容不清楚谁在学习PostgreSQL:
和
有人可以举例说明这两段吗?
有谁知道在哪里可以找到有关PostgreSQL隔离级别行为的正式描述?我正在寻找它,因为它是一个高级主题,我相信正式的描述将有助于阐明它的工作原理,从而避免交易之间的并发错误。
更新:我还有一个疑问:当可序列化的事务可以与其他隔离级别的其他事务并发运行时,如何处理数据库机器决定提交或中止该事务?数据库是否确定可序列化事务的结果,就好像其他事务也以可序列化隔离方式运行一样?
谢谢
更新2 :到目前为止,关于隔离级别的实现细节,我发现的最好的就是PostgreSQL Wiki Serializable Page。
最佳答案
READ COMMITTED
:每个SQL语句都会获取数据库的新快照,因此每条语句在提交的同时始终会看到并发事务所做的更改。不会发生序列化错误。 REPEATABLE READ
:事务中的第一条语句获取为整个事务保留的数据库快照,因此所有语句都看到数据库的相同状态。如果您在拍摄快照后尝试修改已被并发事务修改的行,则可能会发生序列化错误。此隔离级别仅比READ COMMITTED
昂贵。 SERIALIZABLE
:可能导致结果与事务的某些串行执行顺序不一致的任何事务都将中止,并出现序列化错误。可能会有误报。这种隔离级别比其他级别更昂贵。 具体问题的答案:
提交提交隔离中的
INSERT ... ON CONFLICT
:如果事务1已插入一行但尚未提交,则运行
INSERT ... ON CONFLICT
的事务2将等待,直到事务1已提交或回滚,然后根据需要进行更新或插入。不会发生约束冲突。 REPEATABLE READ
:这一段是黑暗的;忽略它。它试图说明两个并发的可重复读转换可能会产生与任何串行执行都不一致的结果。
一个更好的示例可能是两个并发事务,它们都读取相同的数据并根据读取的结果对其进行更新。这些事务中的每一个都看不到其他事务的修改。
查看“可序列化”下的PostgreSQL Wiki,以获取更多详细示例。
这个问题对我来说还不太清楚。
可序列化的事务使用特殊的“SI”锁,该锁跟踪读取和写入访问并在提交期间幸免。它们不会阻止其他 session ,而是用于确定是否可能存在冲突。仅当所有并发事务都使用可序列化隔离级别时,可序列化隔离级别才能正常工作。
关于postgresql - PostgreSQL隔离级别的行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50725403/