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とディスクにかなり高い負荷がかかるからです。 トランザクション中の複数の文の実行はまた、複数の関連するテーブルを更新するときに確実に一貫性を保つためにも便利です。 関連する更新が全て完了していない中間的な状態を、他のセッションからは参照できません。
隔離レベルもしくは読み書きモードが指定されている場合、新しいトランザクションは、SET TRANSACTIONが実行された時と同様の特性を持ちます。
START TRANSACTIONには、BEGINと同じような機能があります。
トランザクションを終了させるにはCOMMITかROLLBACKを使用して ください。
トランザクションブロック内でBEGINを発行すると、警告メッセージが現われます。 トランザクションの状態には影響ありません。 トランザクションブロック内でトランザクションを入れ子にするには、セーブポイントを使用してください。 (詳細はSAVEPOINTを参照してください。)
後方互換性のために、連続するtransaction_modes間のカンマを省略することができます。
BEGINはPostgreSQLの言語拡張です。 標準SQLのSTART TRANSACTIONコマンドと等価です。 互換性について追記していますのでこちらも参照してください。
偶然ですが、BEGINというキーワードは埋め込みSQLでは異なった目的に使われます。 データベースアプリケーションを移植するときはトランザクションの意味で使用されているのかどうか注意するべきでしょう。