PostgreSQL
上一頁   下一頁

BEGIN

名稱

BEGIN ─ 以鏈的模式開始一個事務

  
BEGIN [ WORK | TRANSACTION ]
  

輸入

WORK, TRANSACTION
可選關鍵字。它們沒有作用。

輸出

BEGIN
這表明一個新的事務已經開始。
NOTICE: BeginTransactionBlock and not in default state
這表明該事務已經運行,當前事務沒有被影響。

Description

預設時,Postgres非鏈接模式unchained mode)執行一個事務(在其他資料庫系統裡也稱之為“自動提交”(“autocommit” ))。換句話說,每個用戶語句都是在其自身的事務中運行並且在語句結束時隱含的調用一個提交(commit)(如果執行成功,否則調用一個回卷)。 BEGIN 以鏈接模式(chained mode)初始化一個用戶事務,也就是說所有 BEGIN 命令後的用戶語句都將在一個事務裡面執行直到一個顯式的 COMMITROLLBACK,或執行退出。在鏈接模式裡執行的語句很明顯地快得多,因為事務開始/提交(start/commit)需要大量的CPU和硬碟活動。在一個事務內部執行多條語句時因為可能修改若干個相關的表因而同樣需要一致性。

Postgres 裡預設的事務隔離級別是 READ COMMITTED,這時在事務內部的查詢只看到查詢提交之前的(數據)修改。所以,如果你需要更嚴格的事務隔離,你必須在 BEGIN 後馬上使用 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE。在 SERIALIZABLE 模式裡,查詢將只能看到整個事務開始之前的修改。(實際上是在一個可串行化事務內部第一個 DML 語句執行前的數據)。

如果提交了事務,Postgres 將保証要麼實現所有更新,要麼所有更新都沒有實現。事務有標準的 ACID(量化屬性,一致性,隔離性,持續性)(atomic,consistent,isolatable,and durable)屬性。

注意

請參考 LOCK f語句獲取關於在事務內部鎖定一個表的詳細資訊。

使用 COMMITROLLBACK 結束一個事務。

用法

開始一個用戶事務:

BEGIN WORK;
  

兼容性

SQL92

BEGIN 是 Postgres 語言的擴展。在 SQL92 中沒有顯式的 BEGIN 的定義﹔事務初始化總是隱含的而且使用一個 COMMITROLLBACK 語句終止。

注意:許多關聯式資料庫為了方便提供一個自動提交(autocommit)特性。

順便說一句,BEGIN 關鍵字在嵌入 SQL 裡用於不同的目的。我們建議你在移植資料庫應用時仔細檢查事務的語意。

SQL92 還要求事務的預設隔離級別是 SERIALIZABLE。


上一頁 首頁 下一頁
ALTER USER 開頭 CLOSE