BEGIN [ WORK | TRANSACTION ] [ transaction_mode [, ...] ] transaction_modeは以下のいずれかです。 ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED } READ WRITE | READ ONLY
BEGINはトランザクションブロックを初期化します。 BEGINコマンド以降の文は全て、明示的なCOMMITもしくはROLLBACKが与えられるまで、単一のトランザクションの中で実行されます。 デフォルト(BEGINがない場合)は、PostgreSQLはトランザクションを"自動コミット"で実行します。 つまり、各文はそれぞれ固有のトランザクションの中で実行され、文の終わりで暗黙的にコミットが実行されます(これは実行が成功した場合です。失敗した場合はロールバックされます)。
トランザクションブロック内では、文はより迅速に実行されます。 なぜなら、トランザクションの開始やコミットは、CPUとディスクにかなり高い負荷をかけるからです。 また、1つのトランザクションで複数の文を実行することは、複数の関連するテーブルを更新する際、確実に一貫性を保つためにも役立ちます。 関連する更新の中に完了していないものが存在する中間的な状態が、他のセッションから参照できなくなるからです。
隔離レベルもしくは読み書きモードが指定されている場合、新しいトランザクションは、SET TRANSACTIONが実行された時と同様の特性を持ちます。
START TRANSACTIONには、BEGINと同じ機能があります。
トランザクションを終了させるには、COMMITまたはROLLBACKを使用してください。
トランザクションブロック内でBEGINを発行すると、警告メッセージが表示されます。 ただし、トランザクションの状態には影響ありません。 トランザクションブロック内でトランザクションを入れ子にするには、セーブポイントを使用してください (詳しくはSAVEPOINTを参照してください)。
後方互換性の保持のため、連続するtransaction_modes間のカンマは省略することができます。
BEGINはPostgreSQLの拡張です。 標準SQLのSTART TRANSACTIONコマンドと等価です。 こちらにさらに詳細な互換性については、このコマンドのマニュアルページを参照してください。
埋め込みSQLでは、BEGINというキーワードを異なった目的に使用しています。 データベースアプリケーションを移植する時は、トランザクションの意味で使用されているのかどうかに注意してください。