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';