SET TRANSACTION

Name

SET TRANSACTION -- 設置目前交易的特性

Synopsis

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

這裡的 transaction_mode 是下列之一:

    ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
    READ WRITE | READ ONLY

描述

SET TRANSACTION 命令為目前交易設置特性。 它對後面的交易沒有影響。 SET SESSION CHARACTERISTICS 為一個會話中隨後的每個交易設置預設的隔離級別。 這些預設可以被 SET TRANSACTION 為一個獨立的交易覆蓋。

可用的交易特性是交易隔離級別和交易訪問模式(讀/寫或者只讀)。

交易的隔離級別決定一個交易在同時存在其它並行執行的交易時它能夠看到什麼資料。

READ COMMITTED

一條語句只能看到在它開始之前的資料。這是預設。

SERIALIZABLE

目前的交易中的所有語句只能看到在這次交易第一條查詢或者修改資料的語句執行之前的資料。

SQL 標準還定義了另外兩個級別,READ UNCOMMITTEDREPEATABLE READ。 在 PostgreSQLREAD UNCOMMITTED 被當作 READ COMMITTED, 而 REPEATABLE READ 當作 SERIALIZABLE 看待。

交易隔離級別在交易中第一個資料修改語句(SELECTINSERTDELETEUPDATEFETCH,或者 COPY)執行之後就不能再次設置。 參閱 Chapter 12 獲取有關交易隔離級別和並發性控制的更多訊息。

交易訪問模式決定交易是讀/寫還是只讀。讀/寫是預設。如果一個 交易是只讀,而且寫入的資料表不是臨時資料表,那麼下面的 SQL 命令是不允許的:INSERTUPDATEDELETE,和 COPY TO; 而所有的 CREATEALTER,和 DROP 命令; COMMENTGRANTREVOKETRUNCATE;和 EXPLAIN ANALYZEEXECUTE 都不允許。這是一個高層次的只讀概念,它並不阻止所有對磁盤的寫入。

注意

如果執行 SET TRANSACTION 之前沒有執行 START TRANSACTION 或者 BEGIN,那麼它會顯得沒有效果一樣,因為交易將立即結束。

我們可以用在 BEGIN 或者 START TRANSACTION 裡面聲明所需要的 transaction_modes 的方法來避免使用 SET TRANSACTION

會話的預設交易隔離級別也可以透過設置配置參數default_transaction_isolationdefault_transaction_read_only 的方法來設置。 (實際上 SET SESSION CHARACTERISTICS 只是一個用 SET 來設置這些參數的冗長等效物。) 這就意味著預設值可以透過 ALTER DATABASE,在配置文件裡等方法設置。 參考 Section 16.4 獲取更多訊息。

相容性

兩個命令都在 SQL 標準裡定義了。SQL 裡的預設交易隔離級別是 SERIALIZABLE; 在 PostgreSQL 裡,預設隔離級別是 READ COMMITED,但是您可以用上面的描述修改它。 PostgreSQL 並沒有提供隔離級別 READ UNCOMMITTEDREPEATABLE READ。 因為多版本並發控制,SERIALIZABLE 級別並非真正的可串行化。參閱 Chapter 12 獲取細節。

在 SQL 標準裡還有另外一種交易特性可以用這些命令設置:診斷範圍的大小。這個概念只用於嵌入的 SQL,因此沒有在 PostgreSQL 伺服器裡實現。

SQL 標準要求在相連的 transaction_modes 之間使用逗號, 但是因為歷史原因,PostgreSQL 允許省略這個逗號。