[11/15開催: PostgreSQL Conference Japan 2019 参加受付中] 
他のバージョンの文書 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

BEGIN

Name

BEGIN  --  トランザクションブロックを開始します。

Synopsis

  
BEGIN [ WORK | TRANSACTION ]

入力

WORK
TRANSACTION

オプションのキーワードです。何も影響がありません。

出力

BEGIN

新しいトランザクションが始まったことを表します。

NOTICE: BEGIN: already a transaction in progress

トランザクションがすでに進行中であることを示します。現在のトランザクションには影響を与えません。

説明

デフォルトでは、PostgreSQL はトランザクションを 非連鎖モード(他のデータベースシステムでは "自動コミット" としても知られています)で実行します。言い換えると、それぞれのユーザの文はそれ固有のトランザクションの中で実行され、コミットはその文の終わりに暗黙的に実行されます(実行が成功した場合です。そうでない場合はロールバックされます)。BEGIN はユーザのトランザクションを連鎖モードで開始します。すなわち、 BEGIN コマンド以降のすべてのユーザの文は、明示的な COMMITROLLBACK、もしくは実行の中止までの間、単一のトランザクションにおいて実行されます。連鎖モードにおける文はとても迅速に実行されます。なぜならトランザクションの開始/コミットは CPU とディスクにかなり高い負荷がかかるからです。トランザクション中の複数の文の実行はまた、複数の関連するテーブルを更新するときに一貫性が要求されます。

PostgreSQL におけるデフォルトのトランザクション隔離レベルは、トランザクション内の問い合わせが問い合わせ実行前にコミットされた変更のみを参照できる READ COMMITTED です。したがって、より厳密なトランザクションの隔離を必要とするならば、BEGIN のすぐ後に SET TRANSACTION ISOLATION LEVEL SERIALIZABLE を使わなければなりません。SERIALIZABLE モードでは、問い合わせはトランザクション全体が開始される以前にコミットされた変更のみを参照します(実際には、シリアライザブルなトランザクション中の最初の DML 文の実行以前です)。

もしトランザクションがコミットされたら、 PostgreSQL はすべての更新を行うか、もしくはまったく更新を行わないかのどちらかです。トランザクションには、標準の ACID 性(Atomic:原子性、Consistent:一貫性、Isolatable:隔離性、Durable:耐久性の頭文字)があります。

注釈

トランザクション内におけるテーブルのロックについてのより詳細は LOCKを参照してください。

トランザクションを終了させるには COMMITROLLBACK を使用して下さい。

使用方法

ユーザトランザクションを始めるためには下記のようにします。

BEGIN WORK;

互換性

SQL92

BEGINPostgreSQL の言語拡張です。SQL92 には明示的な BEGIN コマンドはありません。トランザクションの開始は常に暗黙的で、COMMIT または ROLLBACK 文で終了します。

Note: 利便性のために、多くのリレーショナルデータベースシステムは、自動コミット機能を提供しています。

BEGIN というキーワードは埋め込み SQL では異なった目的に使われます。データベースアプリケーションを移植するときはトランザクションの意味で使用されているのかどうか注意するべきでしょう。

SQL92 では、SEREALIZABLE がデフォルトのトランザクション隔離レベルであることを要求しています。