SET TRANSACTION
命令設置當前會話的特性。
簡介
SET SESSION CHARACTERISTICS
設置一個會話后續事務的默認事務特性。在個體事務中可以用 SET TRANSACTION
覆蓋這些默認值。
可用的事務特性是事務隔離級別、事務訪問模式(讀/寫或只讀)以及可延遲模式。此外,可以選擇一個快照,不過只能用于當前事務而不能作為會話默認值。
一個事務的隔離級別決定當其他事務并行運行時該事務能看見什么數據:
READ COMMITTED
一個語句只能看到在它開始前提交的行。這是默認值。REPEATABLE READ
當前事務的所有語句只能看到這個事務中執行的第一個查詢或者數據修改語句之前提交的行。SERIALIZABLE
當前事務的所有語句只能看到這個事務中執行的第一個查詢或者數據修改語句之前提交的行。如果并發的可序列化事務間的讀寫模式可能導致一種那些事務串行(一次一個)執行時不可能出現的情況,其中之一將會被回滾并且得到一個serialization_failure
錯誤。
SQL 標準定義了一種額外的級別:READ UNCOMMITTED
。在 PolarDB中READ UNCOMMITTED
被視作 READ COMMITTED
。
一個事務執行了第一個查詢或者數據修改語句( SELECT
、 INSERT
、DELETE
、 UPDATE
、FETCH
或 COPY
)之后就無法更改事務隔離級別。
事務的訪問模式決定該事務是否為讀/寫或者只讀。讀/寫是默認值。當一個事務為只讀時,如果 SQL 命令INSERT
、UPDATE
、DELETE
和COPY FROM
要寫的表不是一個臨時表,則它們不被允許。不允許CREATE
、ALTER
以及DROP
命令。不允許COMMENT
、GRANT
、REVOKE
、TRUNCATE
。如果EXPLAIN ANALYZE
和EXECUTE
要執行的命令是上述命令之一,則它們也不被允許。這是一種高層的只讀概念,它不能阻止所有對磁盤的寫入。
只有事務也是SERIALIZABLE
以及READ ONLY
時,DEFERRABLE
事務屬性才會有效。當一個事務的所有這三個屬性都被選擇時,該事務在第一次獲取其快照時可能會阻塞,在那之后它運行時就不會有SERIALIZABLE
事務的開銷,并且不會有任何犧牲或者被一次序列化失敗取消的風險。這種模式很適合于長時間運行的報表或者備份。
SET TRANSACTION SNAPSHOT
命令允許新的事務使用與一個現有事務相同的快照運行。已經存在的事務必須已經把它的快照用pg_export_snapshot
函數導出。 該函數會返回一個快照標識符,SET TRANSACTION SNAPSHOT
需要被給定一個快照標識符來指定要導入的快照。 在這個命令中該標識符必須被寫成一個字符串,例如 '000003A1-1'
。SET TRANSACTION SNAPSHOT
只能在一個事務的開始執行,并且要在該事務的第一個查詢或者數據修改語句( SELECT
、 INSERT
、DELETE
、 UPDATE
、FETCH
或 COPY
)之前執行。此外,該事務必須已經被設置為SERIALIZABLE
或者 REPEATABLE READ
隔離級別(否則,該快照將被立刻拋棄, 因為READ COMMITTED
模式會為每一個命令取一個新快照)。 如果導入事務使用了SERIALIZABLE
隔離級別,那么導入快照的事務必須也使用該隔離級別。還有,一個非只讀可序列化事務不能導入來自只讀事務的快照。
語法
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
之前沒有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
等方式設置默認值。
示例
要用一個已經存在的事務的同一快照開始一個新事務,首先要從該現有事務導出快照。這將會返回快照標識符,例如:
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';