?
本文檔使用 PHP中文網(wǎng)手冊(cè) 發(fā)布
SET TRANSACTION transaction_mode [, ...]
SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode [, ...]
where transaction_mode is one of:
這里的transaction_mode是下列之一:
ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
READ WRITE | READ ONLY
SET TRANSACTION命令為當(dāng)前事務(wù)設(shè)置特性。它對(duì) 后面的事務(wù)沒(méi)有影響。SET SESSION CHARACTERISTICS 為一個(gè)會(huì)話(huà)中隨后的每個(gè)事務(wù)設(shè)置缺省的隔離級(jí)別。這些缺省可以被 SET TRANSACTION為一個(gè)獨(dú)立的事務(wù)覆蓋。
可用的事務(wù)特性是事務(wù)隔離級(jí)別和事務(wù)訪(fǎng)問(wèn)模式(讀/寫(xiě)或者只讀)。
事務(wù)的隔離級(jí)別決定一個(gè)事務(wù)在同時(shí)存在其它并發(fā)運(yùn)行 的事務(wù)時(shí)它能夠看到什么數(shù)據(jù):
一條語(yǔ)句只能看到在它開(kāi)始之前的數(shù)據(jù)。這是缺省。
當(dāng)前事務(wù)中的所有語(yǔ)句只能看到在這次事務(wù)第一條查詢(xún)或者修改數(shù)據(jù) 的語(yǔ)句執(zhí)行之前的數(shù)據(jù)。
SQL標(biāo)準(zhǔn)還定義了另外兩個(gè)級(jí)別,READ UNCOMMITTED 和REPEATABLE READ。在PostgreSQL 里READ UNCOMMITTED被當(dāng)作READ COMMITTED, REPEATABLE READ被當(dāng)作SERIALIZABLE。
事務(wù)隔離級(jí)別在事務(wù)中第一個(gè)數(shù)據(jù)修改語(yǔ)句(SELECT、 INSERT、 DELETE、 UPDATE、FETCH或者 COPY)執(zhí)行之后就不能再次設(shè)置。參閱 Chapter 13 獲取有關(guān)事務(wù)隔離級(jí)別和并發(fā)性控制的更多信息。
事務(wù)訪(fǎng)問(wèn)模式?jīng)Q定事務(wù)是讀/寫(xiě)還是只讀。讀/寫(xiě)是缺省。如果一個(gè)事務(wù)是 只讀,而且寫(xiě)入的表不是臨時(shí)表,那么下面的SQL命令是不允許的: INSERT、UPDATE、 DELETE和 COPY FROM ; 而所有的CREATE、ALTER和 DROP; COMMENT, GRANT、REVOKE, TRUNCATE和EXPLAIN ANALYZE 以及EXECUTE都不允許。這是一個(gè)高層次的只讀概念, 它并不阻止所有對(duì)磁盤(pán)的寫(xiě)入。
如果執(zhí)行SET TRANSACTION之前沒(méi)有執(zhí)行 START TRANSACTION或BEGIN, 那么它會(huì)顯得沒(méi)有效果一樣,因?yàn)槭聞?wù)將立即結(jié)束。
可以用在BEGIN或START TRANSACTION 里面聲明所需要的transaction_modes的 方法來(lái)避免使用 SET TRANSACTION 。
會(huì)話(huà)的缺省事務(wù)隔離級(jí)別也可以通過(guò)設(shè)置配置參數(shù) xref linkend="guc-default-transaction-isolation"> 和default_transaction_read_only的方法來(lái) 設(shè)置(實(shí)際上SET SESSION CHARACTERISTICS只是 一個(gè)用SET來(lái)設(shè)置這些參數(shù)的冗長(zhǎng)等效物)。這就意味著 缺省值可以通過(guò)ALTER DATABASE或在配置文件里等方法設(shè)置。 參考Chapter 18獲取更多信息。
兩個(gè)命令都在SQL標(biāo)準(zhǔn)里定義了。SQL里的缺省事務(wù)隔離級(jí)別是 SERIALIZABLE;但在PostgreSQL里,缺省隔離級(jí)別 是READ COMMITTED,但是你可以用上面描述的方法 修改它。因?yàn)槿鄙僦^詞鎖定SERIALIZABLE級(jí)別并非 真正的可串行化。參閱Chapter 13獲取細(xì)節(jié)。
在SQL標(biāo)準(zhǔn)里還有另外一種事務(wù)特性可以用這些命令設(shè)置:診斷范圍的大小。 這個(gè)概念只用于嵌入式SQL,因此沒(méi)有在PostgreSQL 服務(wù)器里實(shí)現(xiàn)。
SQL標(biāo)準(zhǔn)要求在相連的transaction_modes 之間使用逗號(hào),但是因?yàn)闅v史原因,PostgreSQL允許省略這個(gè)逗號(hào)。