您的位置:58编程 > PostgreSQL SET TRANSACTION

PostgreSQL SET TRANSACTION

2023-04-15 02:33

 PostgreSQL SET TRANSACTION

SET TRANSACTION — 设置当前事务的特性

大纲

SET TRANSACTION transaction_mode [, ...]
SET TRANSACTION SNAPSHOT snapshot_id
SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode [, ...]

其中 transaction_mode 是下列之一:

    ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
    READ WRITE | READ ONLY
    [ NOT ] DEFERRABLE

描述

SET TRANSACTION命令设置当前 会话的特性。SET SESSION CHARACTERISTICS设置一个会话后续事务的默认 事务特性。在个体事务中可以用 SET TRANSACTION覆盖这些默认值。

可用的事务特性是事务隔离级别、事务访问模式(读/写或只读)以及 可延迟模式。此外,可以选择一个快照,不过只能用于当前事务而不能 作为会话默认值。

一个事务的隔离级别决定当其他事务并行运行时该事务能看见什么数据:

READ COMMITTED

一个语句只能看到在它开始前提交的行。这是默认值。

REPEATABLE READ

当前事务的所有语句只能看到这个事务中执行的第一个查询或者 数据修改语句之前提交的行。

SERIALIZABLE

当前事务的所有语句只能看到这个事务中执行的第一个查询或者 数据修改语句之前提交的行。如果并发的可序列化事务间的读写 模式可能导致一种那些事务串行(一次一个)执行时不可能出现 的情况,其中之一将会被回滚并且得到一个 serialization_failure错误。

SQL 标准定义了一种额外的级别:READ UNCOMMITTED。在 PostgreSQLREAD UNCOMMITTED被视作 READ COMMITTED

一个事务执行了第一个查询或者数据修改语句( SELECTINSERTDELETEUPDATEFETCHCOPY)之后就无法更改事务隔离级别。 更多有关事务隔离级别和并发控制的信息可见 第 13 章。

事务的访问模式决定该事务是否为读/写或者只读。读/写是默认值。 当一个事务为只读时,如果 SQL 命令 INSERTUPDATEDELETECOPY FROM 要写的表不是一个临时表,则它们不被允许。不允许 CREATEALTER以及 DROP命令。不允许COMMENTGRANTREVOKETRUNCATE。如果EXPLAIN ANALYZEEXECUTE要执行的命令是上述命令之一, 则它们也不被允许。这是一种高层的只读概念,它不能阻止所有对 磁盘的写入。

只有事务也是SERIALIZABLE以及 READ ONLY时,DEFERRABLE 事务属性才会有效。当一个事务的所有这三个属性都被选择时,该事务在 第一次获取其快照时可能会阻塞,在那之后它运行时就不会有 SERIALIZABLE事务的开销并且不会有任何牺牲或者 被一次序列化失败取消的风险。这种模式很适合于长时间运行的报表或者 备份。

SET TRANSACTION SNAPSHOT命令允许新的事务 使用与一个现有事务相同的快照运行。已经存在的事务 必须已经把它的快照用pg_export_snapshot函数( 见第 9.27.5 节)导出。 该函数会返回一个快照标识符,SET TRANSACTION SNAPSHOT需要被给定一个快照标识符来指定要导入的快照。 在这个命令中该标识符必须被写成一个字符串,例如 "000003A1-1"SET TRANSACTION SNAPSHOT只能在一个事务的 开始执行,并且要在该事务的第一个查询或者数据修改语句( SELECTINSERTDELETEUPDATEFETCHCOPY)之前执行。此外,该事务必须已经被设置 为SERIALIZABLE或者 REPEATABLE READ隔离级别(否则,该快照将被立刻抛弃, 因为 READ COMMITTED模式会为每一个命令取一个新快照)。 如果导入事务使用了SERIALIZABLE隔离级别,那么导入快照 的事务必须也使用该隔离级别。还有,一个非只读可序列化事务不能导入来自只读 事务的快照。

注解

如果执行SET TRANSACTION之前没有 START TRANSACTION或者 BEGIN,它会发出一个警告并且不会有任何效果。

可以通过在BEGIN或者 START TRANSACTION中指定想要的transaction_modes来省掉 SET TRANSACTION。但是在 SET TRANSACTION SNAPSHOT中该选项不可用。

会话默认的事务模式也可以通过设置配置参数 default_transaction_isolation、 default_transaction_read_only和 default_transaction_deferrable来设置(实际上 SET SESSION CHARACTERISTICS只是用 SET设置这些变量的等效体)。这意味着可以通过配置文件、 ALTER DATABASE等方式设置默认值。详见 第 19 章。

示例

要用一个已经存在的事务的同一快照开始一个新事务,首先要从该现有 事务导出快照。这将会返回快照标识符,例如:

BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SELECT pg_export_snapshot();
 pg_export_snapshot
---------------------
 00000003-0000001B-1
(1 row)

然后在一个新开始的事务的开头把该快照标识符用在一个 SET TRANSACTION SNAPSHOT命令中:

BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET TRANSACTION SNAPSHOT "00000003-0000001B-1";

兼容性

SQL标准中定义了这些命令,不过 DEFERRABLE事务模式和 SET TRANSACTION SNAPSHOT形式除外,这两者是 PostgreSQL扩展。

SERIALIZABLE是标准中默认的事务隔离级别。在 PostgreSQL中默认值是普通的 READ COMMITTED,但是你可以按上述的方式更改。

在 SQL 标准中,可以用这些命令设置一个其他的事务特性:诊断区域 的尺寸。这个概念与嵌入式 SQL 有关,并且因此没有在 PostgreSQL服务器中实现。

SQL 标准要求连续的transaction_modes之间有逗号, 但是出于历史原因 PostgreSQL允许省略逗号。


阅读全文
以上是58编程为你收集整理的 PostgreSQL SET TRANSACTION全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
  •  PostgreSQL PostgreSQL 客户端应用

    PostgreSQL PostgreSQL 客户端应用

    这部份包含PostgreSQL客户端应用和工具的参考信息。不是所有这些命令都是通用工具,某些需要特殊权限。这些应用的共同特征是它们...

  •  PostgreSQL 概述

    PostgreSQL 概述

    表51.1列出了系统目录。 每个目录更详细的文档见后文。大多数系统目录都是在数据库创建的过程中从模版数据库中拷贝过来的, 因此...

  • vim 前端 Vimscript 前言

    vim 前端 Vimscript 前言

    本书出处:http://learnvimscriptthehardway.onefloweroneworld.com/笨方法学Vimscript面向那些想学会如何自定义Vim编辑器的用户...

  • vim 路径 Vimscript 路径

    vim 路径 Vimscript 路径

    Vim是一个文本编辑器,而文本编辑器(经常)处理文本文件。文本文件储存在文件系统中, 而我们使用路径来描述文件。Vimscript有一...

  • goframe api GoFrame 数据查询-LeftJoin/RightJoin/InnerJoin

    goframe api GoFrame 数据查询-LeftJoin/RightJoin/InnerJoin

    LeftJoin/RightJoin/InnerJoin​LeftJoin左关联查询;​RightJoin右关联查询;​InnerJoin内关联查询;其实我们并不推荐使用​Jo...

  •  XSL-FO azimuth 属性

    XSL-FO azimuth 属性

    XSL-FO azimuth 属性 XSL-FO 参考手册定义和用法 azimuth属性仅能用于Aural StylesheetsAural Stylesheets(音频样式表)。 对文档...

  • xlinkx XLink 实例

    xlinkx XLink 实例

    XLink 实例 当你了解了 XLink 的语法后,你需要通过实例的练习来进一步掌握知识。让我们通过研究一个实例来学习一些基础的 XLink...

  • dtd属性定义 DTD 属性

    dtd属性定义 DTD 属性

    DTD - 属性 任何标记的属性都必须在 DTD 文档中进行声明,并且必须都要通过关键字进行说明!在 DTD 中,属性通过 ATTLIST 声明来...

  •  XML DOM length 属性

    XML DOM length 属性

    XML DOM length 属性 Comment 对象定义和用法 length 属性返回注释节点中文本的长度(以字符计)。 语法commentNode.length 实例...

  • 量词表示 RegExp + 量词

    量词表示 RegExp + 量词

    JavaScript RegExp + 量词 JavaSript RegExp 对象定义和用法n+ 量词匹配包含至少一个 n 的任何字符串。语法new RegExp("n+")或者...

© 2024 58编程 58biancheng.com 版权所有 联系我们
桂ICP备12005667号-32 Powered by CMS