SET TRANSACTION

Name

SET TRANSACTION -- 設置當前事務的特性

Synopsis

SET TRANSACTION
    [ ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE } ]
    [ READ WRITE | READ ONLY ]

SET SESSION CHARACTERISTICS AS TRANSACTION
    [ ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE } ]
    [ READ WRITE | READ ONLY ]
x

描述

SET TRANSACTION 命令為當前事務設置特性。 它對後面的事務沒有影響。 SET SESSION CHARACTERISTICS 為一個會話中的每個事務設置缺省的隔離級別。 SET TRANSACTION 可以為一個獨立的事務覆蓋上面的設置。

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

事務的隔離級別決定一個事務在同時存在其它並行運行的事務時它能夠看到什麼數據。

READ COMMITTED

一條語句只能看到在它開始之前的數據。這是缺省。

SERIALIZABLE

當前的事務只能看到在這次事務第一條查詢或者修改數據的語句執行之前的數據。

提示: 說白了,serializable(可串行化)意味著兩個事務將把數據庫保持在同一個狀態, 就好象這兩個事務是嚴格地按照先後順序執行地那樣。

事務隔離級別在事務中第一個數據修改語句(SELECTINSERTDELETEUPDATEFETCHCOPY)執行之後就不能再次設置。 參閱 Chapter 12 獲取有關事務隔離級別和並發性控制的更多信息。

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

注意

會話的缺省事務隔離級別也可以用命令

SET default_transaction_isolation = 'value'

以及在配置文件裡設置。 參考 Section 16.4 獲取更多信息。

兼容性

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

在 SQL 標準裡還有另外一種事務特性可以用這些命令設置:診斷範圍的大小。這個概念只用于嵌入的 SQL。