SET TRANSACTION transaction_mode [, ...]
SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode [, ...]
where transaction_mode is one of:
这里的transaction_mode是下列之一:
ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
READ WRITE | READ ONLY
SET TRANSACTION命令为当前事务设置特性。它对 后面的事务没有影响。SET SESSION CHARACTERISTICS 为一个会话中随后的每个事务设置缺省的隔离级别。这些缺省可以被 SET TRANSACTION为一个独立的事务覆盖。
可用的事务特性是事务隔离级别和事务访问模式(读/写或者只读)。
事务的隔离级别决定一个事务在同时存在其它并发运行 的事务时它能够看到什么数据:
一条语句只能看到在它开始之前的数据。这是缺省。
当前事务中的所有语句只能看到在这次事务第一条查询或者修改数据 的语句执行之前的数据。
SQL标准还定义了另外两个级别,READ UNCOMMITTED 和REPEATABLE READ。在PostgreSQL 里READ UNCOMMITTED被当作READ COMMITTED, REPEATABLE READ被当作SERIALIZABLE。
事务隔离级别在事务中第一个数据修改语句(SELECT、 INSERT、 DELETE、 UPDATE、FETCH或者 COPY)执行之后就不能再次设置。参阅 Chapter 13 获取有关事务隔离级别和并发性控制的更多信息。
事务访问模式决定事务是读/写还是只读。读/写是缺省。如果一个事务是 只读,而且写入的表不是临时表,那么下面的SQL命令是不允许的: INSERT、UPDATE、 DELETE和 COPY FROM ; 而所有的CREATE、ALTER和 DROP; COMMENT, GRANT、REVOKE, TRUNCATE和EXPLAIN ANALYZE 以及EXECUTE都不允许。这是一个高层次的只读概念, 它并不阻止所有对磁盘的写入。
如果执行SET TRANSACTION之前没有执行 START TRANSACTION或BEGIN, 那么它会显得没有效果一样,因为事务将立即结束。
可以用在BEGIN或START TRANSACTION 里面声明所需要的transaction_modes的 方法来避免使用 SET TRANSACTION 。
会话的缺省事务隔离级别也可以通过设置配置参数 xref linkend="guc-default-transaction-isolation"> 和default_transaction_read_only的方法来 设置(实际上SET SESSION CHARACTERISTICS只是 一个用SET来设置这些参数的冗长等效物)。这就意味着 缺省值可以通过ALTER DATABASE或在配置文件里等方法设置。 参考Chapter 18获取更多信息。
两个命令都在SQL标准里定义了。SQL里的缺省事务隔离级别是 SERIALIZABLE;但在PostgreSQL里,缺省隔离级别 是READ COMMITTED,但是你可以用上面描述的方法 修改它。因为缺少谓词锁定SERIALIZABLE级别并非 真正的可串行化。参阅Chapter 13获取细节。
在SQL标准里还有另外一种事务特性可以用这些命令设置:诊断范围的大小。 这个概念只用于嵌入式SQL,因此没有在PostgreSQL 服务器里实现。
SQL标准要求在相连的transaction_modes 之间使用逗号,但是因为历史原因,PostgreSQL允许省略这个逗号。