SET TRANSACTION

Name

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

Synopsis

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

这里的 transaction_mode 是下列之一:

    ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
    READ WRITE | READ ONLY

描述

SET TRANSACTION 命令为当前事务设置特性。 它对后面的事务没有影响。 SET SESSION CHARACTERISTICS 为一个会话中随后的每个事务设置缺省的隔离级别。 这些缺省可以被 SET TRANSACTION 为一个独立的事务覆盖。

可用的事务特性是事务隔离级别和事务访问模式(读/写或者只读)。

事务的隔离级别决定一个事务在同时存在其它并行运行的事务时它能够看到什么数据。

READ COMMITTED

一条语句只能看到在它开始之前的数据。这是缺省。

SERIALIZABLE

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

SQL 标准还定义了另外两个级别,READ UNCOMMITTEDREPEATABLE READ。 在 PostgreSQLREAD UNCOMMITTED 被当作 READ COMMITTED, 而 REPEATABLE READ 当作 SERIALIZABLE 看待。

事务隔离级别在事务中第一个数据修改语句(SELECTINSERTDELETEUPDATEFETCH,或者 COPY)执行之后就不能再次设置。 参阅 Chapter 12 获取有关事务隔离级别和并发性控制的更多信息。

事务访问模式决定事务是读/写还是只读。读/写是缺省。如果一个 事务是只读,而且写入的表不是临时表,那么下面的 SQL 命令是不允许的:INSERTUPDATEDELETE,和 COPY TO; 而所有的 CREATEALTER,和 DROP 命令; COMMENTGRANTREVOKETRUNCATE;和 EXPLAIN ANALYZEEXECUTE 都不允许。这是一个高层次的只读概念,它并不阻止所有对磁盘的写入。

注意

如果执行 SET TRANSACTION 之前没有执行 START TRANSACTION 或者 BEGIN,那么它会显得没有效果一样,因为事务将立即结束。

我们可以用在 BEGIN 或者 START TRANSACTION 里面声明所需要的 transaction_modes 的方法来避免使用 SET TRANSACTION

会话的缺省事务隔离级别也可以通过设置配置参数default_transaction_isolationdefault_transaction_read_only 的方法来设置。 (实际上 SET SESSION CHARACTERISTICS 只是一个用 SET 来设置这些参数的冗长等效物。) 这就意味着缺省值可以通过 ALTER DATABASE,在配置文件里等方法设置。 参考 Chapter 17 获取更多信息。

兼容性

两个命令都在 SQL 标准里定义了。SQL 里的缺省事务隔离级别是 SERIALIZABLE; 在 PostgreSQL 里,缺省隔离级别是 READ COMMITED,但是你可以用上面的描述修改它。 PostgreSQL 并没有提供隔离级别 READ UNCOMMITTEDREPEATABLE READ。 因为多版本并发控制,SERIALIZABLE 级别并非真正的可串行化。参阅 Chapter 12 获取细节。

在 SQL 标准里还有另外一种事务特性可以用这些命令设置:诊断范围的大小。这个概念只用于嵌入的 SQL,因此没有在 PostgreSQL 服务器里实现。

SQL 标准要求在相连的 transaction_modes 之间使用逗号, 但是因为历史原因,PostgreSQL 允许省略这个逗号。