【发布时间】:2015-10-25 17:28:25
【问题描述】:
根据reference documentation,READ ONLY 事务标志除了允许 DEFERRABLE 事务之外还有用吗?
SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY;
DEFERRABLE 事务属性无效,除非 事务也是可序列化和只读的。当所有三个 这些属性是为交易选择的,交易可能 第一次获取快照时阻塞,之后它可以运行 没有 SERIALIZABLE 事务的正常开销,也没有 参与或被连载取消的任何风险 失败。此模式非常适合长时间运行的报告或备份。
数据库引擎是否针对只读事务运行其他优化?
【问题讨论】:
-
我的理解是读写事务会带来一些开销,但是在你真正写东西之前你不会产生这个开销。换句话说,就性能而言,
READ ONLY事务应该与只包含读取的READ WRITE事务相同。这源于 Postgres 处理 XID 分配的方式(有关此 here 的一些信息)。 -
@NickBarnes 这也符合我的理解。
READ ONLY确实更安全。 -
谢谢。因此,可延期交易是当时唯一的实质性优化。
-
@VladMihalcea 我想知道使用
deferrable提供了哪些实质性优化。文档说“可推迟......可能会在允许继续之前被延迟......一旦开始......它不会产生确保可序列化所需的任何开销;因此序列化代码没有理由强迫它abort ...使此选项适用于长时间运行的只读事务”。不被取消肯定有好处,但是对于reduced serialization overheads,这种潜在的延迟权衡值得吗?不适用于短期查询。 -
有关信息,如果您使用 JDBC,这是 postgres 驱动程序所做的:github.com/pgjdbc/pgjdbc/blob/REL42.1.4/pgjdbc/src/main/java/…
标签: database postgresql transactions readonly database-concurrency