支援的版本: 目前 (17) / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

SET TRANSACTION

SET TRANSACTION — 設定目前交易的特性

概要

SET TRANSACTION transaction_mode [, ...]
SET TRANSACTION SNAPSHOT snapshot_id
SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode [, ...]

where transaction_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

在交易的第一個查詢或資料修改語句(SELECTINSERTDELETEUPDATEMERGEFETCHCOPY)執行後,交易隔離層級不能更改。有關交易隔離和並行控制的更多資訊,請參閱第 13 章

交易存取模式決定了交易是讀/寫還是唯讀。讀/寫是預設值。當交易是唯讀時,以下 SQL 指令是不允許的:INSERTUPDATEDELETEMERGE,以及如果它們要寫入的表不是臨時表,則 COPY FROM ;所有 CREATEALTERDROP 指令; COMMENTGRANTREVOKETRUNCATE;以及 EXPLAIN ANALYZEEXECUTE,如果它們要執行的指令屬於上面列出的指令之一。這是一種高層次的唯讀概念,它並不能阻止所有的磁碟寫入操作。

DEFERRABLE 交易屬性只有在交易也是 SERIALIZABLEREAD ONLY 的情況下才有效。當為交易選擇所有這三個屬性時,交易在第一次獲取其快照時可能會被阻塞,之後它就能夠運行,而無需 SERIALIZABLE 交易的正常開銷,並且沒有任何導致或被序列化失敗取消的風險。這種模式非常適合長時間運行的報告或備份。

SET TRANSACTION SNAPSHOT指令允許新的交易使用與現有交易相同的快照來執行。現有的交易必須使用pg_export_snapshot函數匯出其快照(請參閱第 9.28.5 節)。該函數會傳回快照識別碼,必須將該識別碼提供給SET TRANSACTION SNAPSHOT,以指定要匯入哪個快照。識別碼必須在此指令中寫為字串常值,例如'00000003-0000001B-1'SET TRANSACTION SNAPSHOT只能在交易開始時執行,在交易的第一個查詢或資料修改陳述式(SELECTINSERTDELETEUPDATEMERGEFETCHCOPY)之前。此外,交易必須已設定為SERIALIZABLEREPEATABLE READ隔離層級(否則,快照會立即被捨棄,因為READ COMMITTED模式會為每個指令採用新的快照)。如果匯入交易使用SERIALIZABLE隔離層級,則匯出快照的交易也必須使用該隔離層級。此外,非唯讀的可序列化交易無法從唯讀交易匯入快照。

注意事項

如果在沒有先執行START TRANSACTIONBEGIN的情況下執行SET TRANSACTION,則會發出警告,否則不會產生任何作用。

可以省略SET TRANSACTION,而是在BEGINSTART TRANSACTION中指定所需的transaction_modes。但是,此選項不適用於SET TRANSACTION SNAPSHOT

也可以透過組態參數default_transaction_isolationdefault_transaction_read_onlydefault_transaction_deferrable來設定或檢查會話預設交易模式。(實際上,SET SESSION CHARACTERISTICS只是使用SET設定這些變數的詳細等效方式。)這表示可以在組態檔案中、透過ALTER DATABASE等設定預設值。請參閱第 19 章以取得更多資訊。

目前交易的模式也可以類似地透過組態參數transaction_isolationtransaction_read_onlytransaction_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 允許省略逗號。

提交更正

如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步說明的內容,請使用此表單來報告文件問題。