デフォルトでは、Postgres は (他のデータベースシステムでは "自動コミット" として知られる)非連鎖モード でト ランザクションを実行します。 言い替えると、各ユーザ文はその独自のトランザクションの中 で実行され、その文の終了時に暗黙的なコミットが行なわれます。 (実行が成功した場合であり、そうでない場合はロールバックされます)。 BEGIN はユーザのトランザクションを連鎖モードで 開始します。 すなわち、BEGIN コマンド以降の全てのユーザ文は、明示的な COMMIT, ROLLBACK, あるいは、実行のアボートまでの 1 つのトランザクションで行なわれます。 連鎖モードにおける文はとても高速に実行されます。 なぜならトランザクションの開始/コミットはとても高い CPU とディスクの 能力を必要とするからです。 トランザクション内において複数の文の実行はまた、複数の関連するテー ブルを更新する時には一貫性が要求されます。
Postgresにおけるデフォルトのトランザクションの隔離レベルは READ COMMITTED であり、トランザクション内部の問い合わせは問い合わせ実行前にコミットされた変更のみを参照することができます。 ですので、より厳密なトランザクションの隔離が必要な場合、BEGIN の直後に SET TRANSACTION ISOLATION LEVEL SERIALIZABLE を使用しなければなりません。 SERIALIZABLE モードでは、問い合わせはトランザクション全体が始まる前(実際は、SERIALIZABLE トランザクションにおける最初の DML 文の実行前)にコミットされた変更のみを参照します。
トランザクションがコミットされた場合、 Postgres は確実に、全ての更新を行なうか全く更新を行なわないかのどちらかを行ないます。 トランザクションは 標準 ACID 性 (原始性、一貫性、独立性、継続性)を持ちます。
BEGIN は Postgres の拡張言語です。 SQL92 には明示的な BEGIN コマンドはなく、トランザクションの初期化は常に暗黙的に行なわれ、COMMIT もしくは ROLLBACK 文によって終了します。
Note: 多くのリレーショナルデータベースシステムは簡便性のために自動コミット機能を提供しています。
偶然ですが、埋め込み SQL では BEGIN キーワードが異なる目的で使用されています。 データベースアプリケーションの移植の際には、トランザクションの意味で使用されているのかどうか注意しなければなりません。
また SQL92 では SERIALIZABLE をデフォルトのトランザクションの隔離レベルとすることを要求しています。