デフォルトでは、PostgreSQL はトランザクションを 非連鎖モード(他のデータベースシステムでは "自動コミット" としても知られています)で実行します。言い換えると、それぞれのユーザの文はそれ固有のトランザクションの中で実行され、コミットはその文の終わりに暗黙的に実行されます(実行が成功した場合です。 そうでない場合はロールバックされます)。 BEGIN はユーザのトランザクションを連鎖モードで開始します。すなわち、BEGIN コマンド以降のすべてのユーザの文は、明示的な COMMIT、もしくは ROLLBACK が実行されるまで、単一のトランザクションにおいて実行されます。 連鎖モードにおける文はより迅速に実行されます。なぜなら、トランザクションの開始/コミットには、CPU とディスクにかなり高い負荷がかかるからです。トランザクション中の複数の文の実行はまた、複数の関連するテーブルを更新するときに確実に一貫性を保つためにも便利です。関連する更新がすべて完了していない中間的な状態を、他のクライアントからは参照できません。
PostgreSQL におけるデフォルトのトランザクション隔離レベルは、トランザクション内の各問い合わせが、その問い合わせの実行開始前にコミットされた変更を参照できる、READ COMMITTED です。したがって、より厳密なトランザクションの隔離を必要とするならば、BEGIN のすぐ後に SET TRANSACTION ISOLATION LEVEL SERIALIZABLE を使わなければなりません。 (もしくは、トランザクション隔離レベルのデフォルトを変更することができます。詳細は、PostgreSQL 管理者用ガイドを参照してください。) SERIALIZABLE モードでは、問い合わせはトランザクション全体が開始される以前にコミットされた変更のみを参照します (実際には、そのトランザクション中の最初の DML 文の実行以前です)。
トランザクションには、標準の ACID 性 (Atomic:原子性、Consistent:一貫性、Isolatable:隔離性、Durable:耐久性、の頭文字) があります。
START TRANSACTION には、BEGIN と同じような機能があります。
トランザクションを終了させるには COMMIT か ROLLBACK を使用して 下さい。
トランザクション内におけるテーブルのロックについてのより詳細は LOCKを参照してください。
autocommit モードをオフにした場合、BEGIN は不要です。 SQL コマンドであればすべて、実行すると自動的にトランザクションを開始します。
BEGIN は PostgreSQL の言語拡張です。SQL92 には明示的な BEGIN コマンドはありません。 トランザクションの開始は常に暗黙的で、COMMIT または ROLLBACK 文で終了します。
Note: 利便性のために、多くのリレーショナルデータベースシステムは、自動コミット機能を提供しています。
BEGIN というキーワードは埋め込み SQL では異なった目的に使われます。データベースアプリケーションを移植するときはトランザクションの意味で使用されているのかどうか注意するべきでしょう。
SQL92 では、SEREALIZABLE がデフォルトのトランザクション隔離レベルであることを要求しています。