PostgreSQL serializable read only deferrable事务的用法背景

在开始讲serializable read only deferrable用法前,需要先了解一下serializable隔离级别。
https://wiki.postgresql.org/wiki/Serializable
http://www.postgresql.org/docs/9.5/static/transaction-iso.html#XACT-SERIALIZABLE
http://blog.163.com/digoal@126/blog/static/1638770402013111795219541

serializable是最高的隔离级别,模拟并行事务的串行处理,当不能实现串行一致时,后提交的会话需要回滚,因此serializable事务相互之间是有干扰的。
PostgreSQL在三个地方介绍到了serializable的deferrable用法。
有些时候,用户可能会需要串行一致的视角执行SQL来统计一些数据的报告,这些SQL可能需要运行非常长的时间,但是只需要只读操作。对于运行非常长时间的串行事务,即使是只读的,也可能和之前已经开启并正在执行的其他串行事务产生干扰,从而导致其他串行事务需要回滚。
因此对于这类长时间运行的只读串行事务,我们可以使用一个deferrable模式,这个模式是等待其他的串行事务结束或确保其他正在执行的串行事务不会与当前的串行事务冲突,然后才开始执行只读SQL。
这个时间是不可控的。
但是好处是,当你运行非常长的串行只读事务中的SQL时,不会再感染其他人执行的串行事务了,你爱跑多长时间都行。
在pg_dump中也有用到,看pg_dump 的说明:
(因为pg_dump通常需要长时间运行,使用--serializable-deferrable是指从串行视角来备份数据库,从而得到串行一致的备份数据)
pg_dump默认是使用repeatable read隔离级别来备份的。

       --serializable-deferrable
           Use a serializable transaction for the dump, to ensure that the snapshot used is consistent with later database states; but do this by waiting for a point in the transaction stream at which no anomalies can be present,
           so that there isn't a risk of the dump failing or causing other transactions to roll back with a serialization_failure. See Chapter 13, Concurrency Control, in the documentation for more information about transaction
           isolation and concurrency control.

           This option is not beneficial for a dump which is intended only for disaster recovery. It could be useful for a dump used to load a copy of the database for reporting or other read-only load sharing while the original
           database continues to be updated. Without it the dump may reflect a state which is not consistent with any serial execution of the transactions eventually committed. For example, if batch processing techniques are used,
           a batch may show as closed in the dump without all of the items which are in the batch appearing.

           This option will make no difference if there are no read-write transactions active when pg_dump is started. If read-write transactions are active, the start of the dump may be delayed for an indeterminate length of time.
           Once running, performance with or without the switch is the same.

set transaction语法也支持设置deferrable属性
deferrable值对read only serializable事务生效

http://www.postgresql.org/docs/9.5/static/sql-set-transaction.html

The DEFERRABLE transaction property has no effect unless the transaction is also SERIALIZABLE and READ ONLY. When all three of these properties are selected for a transaction, the transaction may block when first acquiring its snapshot, after which it is able to run without the normal overhead of a SERIALIZABLE transaction and without any risk of contributing to or being canceled by a serialization failure. This mode is well suited for long-running reports or backups.

还有一个参数控制默认的serializable read only事务是否为deferrable。

http://www.postgresql.org/docs/9.5/static/runtime-config-client.html#GUC-DEFAULT-TRANSACTION-DEFERRABLE

default_transaction_deferrable (boolean)
When running at the serializable isolation level, a deferrable read-only SQL transaction may be delayed before it is allowed to proceed. However, once it begins executing it does not incur any of the overhead required to ensure serializability; so serialization code will have no reason to force it to abort because of concurrent updates, making this option suitable for long-running read-only transactions.

This parameter controls the default deferrable status of each new transaction. It currently has no effect on read-write transactions or those operating at isolation levels lower than serializable. The default is off.
时间: 2024-09-24 13:46:20

PostgreSQL serializable read only deferrable事务的用法背景的相关文章

PostgreSQL 聚合表达式 FILTER , order , within group 用法

标签 PostgreSQL , 聚合 , filter , order , within group 背景 PostgreSQL的分析功能还是比较强大的,例如支持多维分析,支持4大类聚合,支持窗口查询,支持递归查询等. 4大类聚合的用法请参考 <PostgreSQL aggregate function 1 : General-Purpose Aggregate Functions> <PostgreSQL aggregate function 2 : Aggregate Functio

深入解读PostgreSQL中的序列及其相关函数的用法_PostgreSQL

一.简介 序列对象(也叫序列生成器)就是用CREATE SEQUENCE 创建的特殊的单行表.一个序列对象通常用于为行或者表生成唯一的标识符. 二.创建序列 方法一:直接在表中指定字段类型为serial 类型 david=# create table tbl_xulie ( david(# id serial, david(# name text); NOTICE: CREATE TABLE will create implicit sequence "tbl_xulie_id_seq"

PostgreSQL pgbench SQL RT 与 事务RT 浅析

背景 使用pgbench测试数据库性能时,在输出的报告中,可以输出事务的平均RT,以及单条SQL的平均RT. 那么这两个有什么分别呢? 每行代表一个线程,被填充了颜色的部分表示从客户端发起SQL到SQL返回的时间窗口,没有填充颜色的部分表示线程的空闲时间. 如何统计事务 平均RT : 执行的事务数/总的测试时长 如何统计SQL 平均RT : 每条SQL的执行时长累加/总的SQL执行次数 从计算公式以及图例来分析,显然SQL的平均RT会更低,因为没有计算线程的空闲时间. 特别是pgbench与数据

PostgreSQL SQL 语言:并发控制

本文档为PostgreSQL 9.6.0文档,本转载已得到原译者彭煜玮授权. 1. 介绍 PostgreSQL为开发者提供了一组丰富的工具来管理对数据的并发访问.在内部,数据一致性通过使用一种多版本模型(多版本并发控制,MVCC)来维护.这就意味着每个 SQL 语句看到的都只是一小段时间之前的数据快照(一个数据库版本),而不管底层数据的当前状态.这样可以保护语句不会看到可能由其他在相同数据行上执行更新的并发事务造成的不一致数据,为每一个数据库会话提供事务隔离.MVCC避免了传统的数据库系统的锁定

PostgreSQL 数据rotate用法介绍

标签 PostgreSQL , 按时间覆盖历史数据 背景 在某些业务场景中,数据有冷热之分,例如业务只关心最近一天.一周或者一个月的数据.对于历史的数据可以丢弃. 比如某些指标的监控场景,保留一周的监控数据,历史的都可以丢弃. 如何丢弃历史数据?或者说如何实现rotate? 1. 使用delete, 删除7天前的数据. delete from table where crt_time<=now()-interval '7 day'; 这种方法会带来额外的开销,包括写REDO日志,垃圾回收等.如果

PostgreSQL 10.0 preview sharding增强 - 支持分布式事务

标签 PostgreSQL , 10.0 , sharding , 分布式事务 , 2pc , 两阶段事务 背景 作为一个完整的分布式数据库(sharding),没有分布式事务支持是不行的. 什么是分布式事务呢?比如我们把一个数据库比作一个小朋友,每个小朋友都有100块钱,然后A小朋友给了B小朋友20块钱,这样的话应该是A剩余80块,B剩余120块.如果在交易过程中B小朋友不小心把20块弄丢了,那么会怎么样呢? 理论上应该是交易不成功,A和B都回到100块的状态. 不应该出现中间状态. Post

sql事务(Transaction)用法介绍及回滚实例

当对多个表进行更新的时候,某条执行失败.为了保持数据的完整性,需要使用事务回滚. 显示设置事务  代码如下 复制代码 begin try begin transaction insert into shiwu (asd) values ('aasdasda'); commit transaction end try begin catch select ERROR_NUMBER() as errornumber rollback transaction end catch 隐式设置事务  代码如

PostgreSQL - 鱼与熊掌可兼得 - 多副本0丢失与高性能兼得 - 事务级异步、同步开关

标签 PostgreSQL , synchronous_commit , redo , local , remote_write , remote_apply , on , off 背景 大多数的数据库属于IO密集型应用,特别是写繁忙的TP系统,例如账户系统. 为了保证数据的可靠性,事务提交时,需要确保事务产生的REDO落到持久化的存储中. 为了提高响应时间,除了数据库软件本身的优化,例如分组提交(降低IO频次).还可以通过购买高IOPS能力的硬件来实现RT时延的降低. 当然,将来硬盘的IO延迟

PostgreSQL 最佳实践 - 在线逻辑备份与恢复介绍

背景 PostgreSQL 逻辑备份, 指在线备份数据库数据, DDL以SQL语句形式输出, 数据则可以以SQL语句或者固定分隔符(row格式)的形式输出. 备份时不影响其他用户对备份对象的DML操作. 本文主要介绍一下PostgreSQL提供的逻辑备份工具pg_dump, pg_dumpall, 以及数据库的COPY命令的备份方法. pg_dump 使用pg_dump进行备份时, 其他用户可以同时进行DML(SELECT, UPDATE, DELETE, INSERT)操作, 相互之间没有干扰