トランザクションは、1 つのアトミック操作として実行される作業単位です。つまり、操作全体が成功または失敗します。 たとえば、ある銀行口座から別の銀行口座に送金することを検討してください。 これには、最初の口座からお金を引き出し、2番目の口座に入金する2つのステップが含まれます。 両方の手順が成功することが重要です。一方のステップが成功し、もう一方が失敗することは許容されません。 トランザクションをサポートするデータベースは、これを保証できます。
トランザクションは、コミットするかロールバックされることで完了できます。 トランザクションがコミットされると、そのトランザクションで行われた変更は永続的になります。 トランザクションがロールバックされると、影響を受ける行は、トランザクションが開始される前の状態に戻されます。 アカウント転送の例を拡張するために、アプリケーションは 1 つの SQL ステートメントを実行して最初のアカウントを借方にし、別の SQL ステートメントを実行して 2 番目のアカウントにクレジットを与えます。 両方のステートメントが成功した場合、アプリケーションはトランザクションをコミットします。 ただし、いずれかのステートメントが何らかの理由で失敗した場合、アプリケーションはトランザクションをロールバックします。 どちらの場合も、アプリケーションはトランザクションの終了時に一貫した状態を保証します。
1 つのトランザクションには、異なる時間に発生する複数のデータベース操作が含まれる場合があります。 他のトランザクションが中間結果に完全にアクセスしていた場合、トランザクションが相互に干渉する可能性があります。 たとえば、あるトランザクションが行を挿入し、2 番目のトランザクションがその行を読み取り、最初のトランザクションがロールバックされるとします。 2 番目のトランザクションには、存在しない行のデータが含まれるようになりました。
この問題を解決するために、トランザクションを互いに分離するためのさまざまなスキームがあります。 トランザクションの分離 は、通常、複数のトランザクションが同じ行を同時に使用することを妨げる行をロックすることによって実装されます。 一部のデータベースでは、行をロックすると、他の行もロックされる場合があります。
トランザクションの分離が向上すると 、コンカレンシー が低下するか、2 つのトランザクションで同じデータを同時に使用できるようになります。 詳細については、「 トランザクション分離レベルの設定」を参照してください。
このセクションでは、次のトピックを扱います。