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 为一个独立的事务覆盖。
可用的事务特性是事务隔离级别和事务访问模式(读/写或者只读)。
事务的隔离级别决定一个事务在同时存在其它并发运行的事务时它能够看到什么数据:
一条语句只能看到在它开始之前的数据。这是缺省。
当前事务中的所有语句只能看到在这次事务第一条查询或者修改数据的语句执行之前的数据。
SQL 标准还定义了另外两个级别,READ UNCOMMITTED 和 REPEATABLE READ 。在 PostgreSQL 里 READ UNCOMMITTED 被当作 READ COMMITTED ,REPEATABLE READ 被当作 SERIALIZABLE
事务隔离级别在事务中第一个数据修改语句(SELECT, INSERT, DELETE, UPDATE, FETCH, COPY)执行之后就不能再次设置。参阅章12获取有关事务隔离级别和并发性控制的更多信息。
事务访问模式决定事务是读/写还是只读。读/写是缺省。如果一个事务是只读,而且写入的表不是临时表,那么下面的 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 。
会话的缺省事务隔离级别也可以通过设置配置参数 default_transaction_isolation 和 default_transaction_read_only 的方法来设置(实际上 SET SESSION CHARACTERISTICS 只是一个用 SET 来设置这些参数的冗长等效物)。这就意味着缺省值可以通过 ALTER DATABASE 或在配置文件里等方法设置。参考章17获取更多信息。
两个命令都在 SQL 标准里定义了。SQL 里的缺省事务隔离级别是 SERIALIZABLE ;但在 PostgreSQL 里,缺省隔离级别是 READ COMMITTED ,但是你可以用上面描述的方法修改它。因为缺少谓词锁定 SERIALIZABLE 级别并非真正的可串行化。参阅章12获取细节。
在 SQL 标准里还有另外一种事务特性可以用这些命令设置:诊断范围的大小。这个概念只用于嵌入式 SQL ,因此没有在 PostgreSQL 服务器里实现。
SQL 标准要求在相连的 transaction_modes 之间使用逗号,但是因为历史原因,PostgreSQL 允许省略这个逗号。