根据参考文档,READ ONLY事务标志除了允许DEFERRABLE事务外还有其他用途吗?
SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY;
除非事务也是串行化和只读的,否则DEFERRABLE事务属性没有任何效果。当为事务选择这三个属性时,事务在首次获取其快照时可能会被阻塞,之后它能够运行而不需要SERIALIZABLE事务的正常开销,并且没有对串行化故障产生贡献或被取消的风险。此模式非常适合长时间运行的报告或备份。
数据库引擎是否为只读事务运行其他优化?
READ WRITE
事务应该与一个READ ONLY
事务相同。这源于Postgres处理XID分配的方式(有关此信息,请参见此处)。 - Nick BarnesREAD ONLY
更多的是一种安全措施。 - Craig Ringerdeferrable
会提供什么实质性的优化。文档中说,“deferrable ... 可以在允许它继续之前被延迟 ... 一旦开始 ... 它不会产生任何确保串行化所需的开销;因此串行化代码将没有理由强制其中止 ... 这使得该选项适用于长时间运行的只读事务”。无疑,不被取消是有好处的,但为了减少串行化开销
而潜在的延迟是否值得呢?对于短时间运行的查询来说并不值得。 - Davos