トランザクションについて説明する

完了

トランザクションは、1 つの単位として扱われる 1 つ以上の T-SQL ステートメントです。 1 つのトランザクションが失敗した場合、すべてのステートメントが失敗します。 トランザクションが成功した場合、トランザクション内のすべてのデータ変更ステートメントが成功し、データベースにコミットされたことがわかります。

トランザクションは、トランザクション内のすべてのステートメントが成功または失敗することを保証します。部分的な完了は許可されません。 トランザクションは、複数のエントリなど、論理的に一緒に実行する必要がある操作を、1 つの操作の一部である関連テーブルにカプセル化します。

Sales.Order テーブルに購入を格納し、Sales.Payment テーブルに支払いを格納するビジネスを考えてみましょう。 誰かが何かを購入するときは、両方のテーブルを更新する必要があります。 トランザクションなしでこれが実装され、支払がデータベースに書き込まれるときにエラーが発生した場合、 Sales.Order 挿入はコミットされ、支払テーブルはエントリなしで残ります。

トランザクションでこれを実装すると、両方のエントリが作成されるか、どちらのエントリも作成されません。 テーブルに支払いを書き込む際にエラーが発生した場合、注文の挿入もロールバックされます。 これは、データベースが常に一貫性のある状態であることを意味します。

トランザクションを使用する場合と使用しない場合の違いを示す図。

これは、ハードウェアエラーやネットワークエラーなどの重大なエラーを指します。 SQL ステートメントでエラーが発生した場合、トランザクションは特定の状況でのみロールバックされるため、このモジュールの後続のユニットを確認して、トランザクションの使用による影響を完全に理解することが重要です。

トランザクションにはさまざまな種類があります。

明示的なトランザクション

キーワード BEGIN TRANSACTION と COMMIT または ROLLBACK は、ステートメントの各バッチを開始および終了します。 これにより、コミットまたはロールバックがまとめて行われる必要があるステートメントを指定できます。

暗黙的なトランザクション

トランザクションは、前のトランザクションが完了したときに開始されます。 各トランザクションは、COMMIT ステートメントまたは ROLLBACK ステートメントを使用して明示的に完了します。

ACID 特性

オンライン トランザクション処理 (OLTP) システムでは、"ACID" 特性を満たすトランザクションが必要です。

  • 原子性 – 各トランザクションは 1 つの単位として扱われ、完全に成功するか、完全に失敗します。 たとえば、1 つのアカウントの資金を引き落とし、別のアカウントに同じ金額を入金するトランザクションでは、両方のアクションを完了する必要があります。 いずれかの操作を完了できない場合、もう一方のアクションは失敗する必要があります。
  • 整合性 – トランザクションは、データベース内のデータを有効な状態から別の状態に取得することしかできません。 上記の借方と貸方の例を続けると、トランザクションの完了状態に、あるアカウントからもう一方のアカウントへの資金の転送が反映されている必要があります。
  • 分離 – 同時実行トランザクションは相互に干渉できず、一貫性のあるデータベース状態にする必要があります。 たとえば、ある口座から別の口座に資金を送金するトランザクションは処理中ですが、これらの口座の残高をチェックする別のトランザクションは、一貫性のある結果を返す必要があります。残高チェックトランザクションは、送金前の残高を反映する 1 つの口座の値と、送金後の残高を反映するもう一方の口座の値を取得できません。
  • 持続性 – トランザクションがコミットされると、トランザクションはコミットされたままになります。 アカウント送金トランザクションが完了すると、変更されたアカウントの残高が保持されます。これにより、データベース システムをオフにした場合でも、コミットされたトランザクションは再びオンになったときに反映されるようになります。