SET TRANSACTION — 設定當前事務的特性
SET TRANSACTIONtransaction_mode
[, ...] SET TRANSACTION SNAPSHOTsnapshot_id
SET SESSION CHARACTERISTICS AS TRANSACTIONtransaction_mode
[, ...] wheretransaction_mode
is one of: ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED } READ WRITE | READ ONLY [ NOT ] DEFERRABLE
SET TRANSACTION
命令用於設定當前事務的特性。它對任何後續事務都無效。SET SESSION CHARACTERISTICS
用於設定會話後續事務的預設事務特性。這些預設值可以被 SET TRANSACTION
為單個事務覆蓋。
可用的事務特性是事務隔離級別、事務訪問模式(讀/寫或只讀)以及延遲模式。此外,可以選擇一個快照,但僅限於當前事務,不能作為會話預設值。
事務的隔離級別決定了在其他事務併發執行時,該事務可以看到什麼資料
READ COMMITTED
語句只能看到在語句開始之前已提交的行。這是預設值。
REPEATABLE READ
當前事務的所有語句只能看到在當前事務中第一個查詢或資料修改語句執行之前已提交的行。
SERIALIZABLE
當前事務的所有語句只能看到在當前事務中第一個查詢或資料修改語句執行之前已提交的行。如果併發的可序列化事務之間的讀寫模式會造成一種情況,而這種情況在任何序列(一次一個)執行這些事務的情況下都不可能發生,那麼其中一個事務將被回滾並出現 serialization_failure
錯誤。
SQL 標準定義了一個額外的級別 READ UNCOMMITTED
。在 PostgreSQL 中,READ UNCOMMITTED
被視為 READ COMMITTED
。
事務的隔離級別在事務中的第一個查詢或資料修改語句(SELECT
、INSERT
、DELETE
、UPDATE
、MERGE
、FETCH
或 COPY
)執行後就不能再更改了。有關事務隔離和併發控制的更多資訊,請參閱 第 13 章。
事務的訪問模式決定了事務是讀/寫還是隻讀。讀/寫是預設模式。當事務為只讀時,以下 SQL 命令是不允許的:INSERT
、UPDATE
、DELETE
、MERGE
,以及 COPY FROM
(如果它們會寫入的表不是臨時表);所有 CREATE
、ALTER
和 DROP
命令;COMMENT
、GRANT
、REVOKE
、TRUNCATE
;以及 EXPLAIN ANALYZE
和 EXECUTE
(如果它們要執行的命令屬於上述列表中的命令)。這是一個高級別的只讀概念,並不阻止所有寫入磁碟的操作。
DEFERRABLE
事務屬性只有在事務同時也是 SERIALIZABLE
和 READ ONLY
時才有效。當這三個屬性都為事務選擇時,事務在首次獲取其快照時可能會被阻塞,之後它就可以在沒有 SERIALIZABLE
事務的正常開銷的情況下執行,並且沒有任何風險會導致或被序列化失敗取消。這種模式非常適合長時間執行的報告或備份。
SET TRANSACTION SNAPSHOT
命令允許新事務使用與現有事務相同的 快照 執行。預先存在的事務必須已使用 pg_export_snapshot
函式匯出了其快照(請參閱 第 9.28.5 節)。該函式返回一個快照識別符號,必須將其提供給 SET TRANSACTION SNAPSHOT
來指定要匯入的快照。在此命令中,識別符號必須寫成字串字面量,例如 '00000003-0000001B-1'
。SET TRANSACTION SNAPSHOT
只能在事務開始時執行,即在事務的第一個查詢或資料修改語句(SELECT
、INSERT
、DELETE
、UPDATE
、MERGE
、FETCH
或 COPY
)之前執行。此外,事務必須已經設定為 SERIALIZABLE
或 REPEATABLE READ
隔離級別(否則,快照將立即被丟棄,因為 READ COMMITTED
模式為每個命令獲取新快照)。如果匯入事務使用 SERIALIZABLE
隔離級別,那麼匯出快照的事務也必須使用該隔離級別。此外,非只讀的可序列化事務不能從只讀事務匯入快照。
如果 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
等方式設定。有關更多資訊,請參閱 第 19 章。
當前事務的模式也可以透過配置引數 transaction_isolation、transaction_read_only 和 transaction_deferrable 來設定或檢視。設定其中一個引數的作用與相應的 SET TRANSACTION
選項相同,並且具有相同的限制條件。但是,這些引數不能在配置檔案中設定,也不能從任何除了即時 SQL 之外的來源設定。
要以與現有事務相同的快照開始一個新事務,請首先從現有事務中匯出快照。這將返回快照識別符號,例如
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';
這些命令定義在SQL標準中,除了 DEFERRABLE
事務模式和 SET TRANSACTION SNAPSHOT
形式,這些是 PostgreSQL 的擴充套件。
在標準中,SERIALIZABLE
是預設的事務隔離級別。在 PostgreSQL 中,預設值通常是 READ COMMITTED
,但您可以按上述方式更改它。
在 SQL 標準中,還有一個事務特性可以透過這些命令設定:診斷區域的大小。這個概念特定於嵌入式 SQL,因此在 PostgreSQL 伺服器中沒有實現。
SQL 標準要求在連續的 transaction_modes
之間使用逗號分隔,但出於歷史原因,PostgreSQL 允許省略逗號。
如果您在文件中看到任何不正確、不符合您對特定功能的使用體驗或需要進一步澄清的內容,請使用 此表格 報告文件問題。