SET TRANSACTION
SET TRANSACTION — 设置当前事务的特性
大纲
SET TRANSACTION
[ ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE } ] [ READ WRITE | READ ONLY ]
SET SESSION CHARACTERISTICS AS TRANSACTION
[ ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE } ] [ READ WRITE | READ ONLY ]描述
SET TRANSACTION 命令设置当前事务的事务特性。它对任何后续事务都没有影响。SET SESSION
CHARACTERISTICS 设置一个会话中每个事务的默认事务特性。对于单个事务,SET
TRANSACTION 可以覆盖它。
可用的事务特性是事务隔离级别和事务访问模式(读/写或只读)。
事务的隔离级别决定该事务在其他事务并发运行时能看到哪些数据。
READ COMMITTED一条语句只能看到在它开始之前已提交的行。这是默认值。
SERIALIZABLE当前事务只能看到在本事务中第一条查询或数据修改语句执行之前已提交的行。
提示
直观地说,可串行化意味着两个并发事务给数据库留下的状态,与这两个事务严格地一个接一个按任一顺序执行后的状态相同。
The transaction isolation level cannot be set after the first query
or data-modification statement (SELECT,
INSERT, DELETE,
UPDATE, FETCH,
COPY) of a transaction has been executed. See
第 12 章 for more information about transaction
isolation and concurrency control.
事务访问模式决定事务是读/写还是只读。默认为读/写。当事务为只读时,下列 SQL 命令被禁止:INSERT、UPDATE、DELETE 和 COPY FROM(如果它们要写入的表不是临时表);所有
CREATE、ALTER 和
DROP 命令;COMMENT、GRANT、REVOKE、TRUNCATE;以及 EXPLAIN ANALYZE
和 EXECUTE(如果它们要执行的命令在上述之列)。这是高层的只读概念,并不阻止写磁盘。
兼容性
这两条命令都在 SQL 标准中定义。标准中默认的事务隔离级别是
SERIALIZABLE;在 PostgreSQL 中默认通常是 READ COMMITTED,但你可以按上文所述更改它。PostgreSQL 不提供隔离级别 READ UNCOMMITTED
和 REPEATABLE READ。由于多版本并发控制,SERIALIZABLE 级别并非真正的可串行化。细节见第 12 章。
在 SQL 标准中,还有一项可以用这些命令设置的事务特性:诊断区域的大小。这个概念只在嵌入式 SQL 中使用。