BEGIN

Name

BEGIN  --  連鎖モードでのトランザクションの開始

Synopsis

  
BEGIN [ WORK | TRANSACTION ]
  

入力

WORK, TRANSACTION

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

出力

BEGIN

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

NOTICE: BEGIN: already a transaction in progress

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

説明

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

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

もしトランザクションがコミットされたら、 Postgres は全ての更新が行なうか、もしくは更新を行なわないかのどちらかです。 トランザクションには、標準の ACID 性 (atomic(原子性), consistent(一貫性), isolatable(隔離性), durable(耐久性)) があります。

注釈

トランザクション内のテーブルのロックに関するさらに詳しい情報は LOCKを 参照してください。

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

使用方法

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

BEGIN WORK;
  

互換性

SQL92

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

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

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

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