BEGIN
語法
BEGIN [ WORK | TRANSACTION ]
可選關鍵字。它們沒有作用。
輸出
-
BEGIN
-
這表明一個新的事務已經開始。
-
NOTICE: BEGIN: already a transaction in progress
這表明該事務已經運行,當前事務沒有被影響。
描述
預設時,
Postgres 以
非鏈接模式(
unchained
mode)執行一個事務(在其他資料庫系統裡也稱之為“自動提交”(
"autocommit"))。換句話說,每個用戶語句都是在其自身的事務中運行並且在語句結束時隱含的調用一個提交(commit)(如果執行成功則提交,否則調用一個回卷)。
BEGIN
以鏈接模式(chained mode)初始化一個用戶事務,也就是說所有
BEGIN
命令後的用戶語句都將在一個事務裡面執行直到一個顯式的
COMMIT,
ROLLBACK,或執行退出。在鏈接模式裡執行的語句很明顯地快得多,因為事務開始/提交(start/commit)需要大量的CPU和硬碟活動。在一個事務內部執行多條語句時因為可能修改若干個相關的表因而同樣需要一致性。
在 Postgres 裡預設的事務隔離級別是
READ COMMITTED,這時在事務內部的查詢只看到查詢提交之前的(數據)修改。所以,如果你需要更嚴格的事務隔離,你必須在
BEGIN
後馬上使用 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE。在 SERIALIZABLE
模式裡,查詢將只能看到整個事務開始之前的修改。(實際上是在一個可串行化事務內部第一個
DML 語句執行前的數據)。
如果提交了事務,Postgres 將保証要麼實現所有更新,要麼所有更新都沒有實現。事務有標準的ACID(不可分割性,一致性,隔離性,持續性)(atomic,consistent,isolatable,and
durable)屬性。
用法
開始一個用戶事務:
BEGIN WORK;
兼容性
SQL92
BEGIN 是
Postgres 語言的擴展。在
SQL92
中沒有顯式的
BEGIN 的定義﹔事務初始化總是隱含的而且使用一個
COMMIT
或
ROLLBACK 語句終止。
注意:許多關聯式資料庫為了方便提供一個自動提交(autocommit)特性。
順便說一句,
BEGIN 關鍵字在嵌入 SQL 裡用於不同的目的。我們建議你在移植資料庫應用時仔細檢查事務的語意。
SQL92 還要求事務的預設隔離級別是 SERIALIZABLE。