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
隔離層級,則匯出快照的交易也必須使用該隔離層級。此外,非唯讀的可序列化交易無法從唯讀交易匯入快照。
如果在沒有先執行START TRANSACTION
或BEGIN
的情況下執行SET TRANSACTION
,則會發出警告,否則不會產生任何作用。
可以省略SET TRANSACTION
,而是在BEGIN
或START TRANSACTION
中指定所需的transaction_modes
。但是,此選項不適用於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 允許省略逗號。
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步說明的內容,請使用此表單來報告文件問題。