トランザクション: コンピュータ用語で、データベース内のさまざまなデータ項目にアクセスし、場合によっては更新するプログラム実行の単位。
トランザクションの4つの特徴(ACID)
- アトミック性: トランザクションは完全な操作であり、トランザクションの各ステップは分割できず (アトミック)、すべてが実行されるか、まったく実行されないかのいずれかです。
- 一貫性: トランザクションが完了すると、データは一貫した状態になる必要があります。
- 分離: データを変更するすべての同時トランザクションは互いに分離されています。つまり、トランザクションは独立している必要があり、他のトランザクションにいかなる形でも依存したり影響を与えたりしてはなりません。
- 耐久性: トランザクションの完了後、データベースへの変更は永続的に維持され、トランザクション ログはトランザクションの永続性を維持できます。
分離を考慮しない場合、3 つの大きな問題がありますか?
- ダーティ リード: トランザクションはコミットされず、事前に読み取られます (つまり、トランザクション B のコミットされていないデータがトランザクション A で読み取られ、データ エラーが発生します)。
- 非反復読み取り: データベース内の特定のデータについては、クエリ間隔中に別のトランザクションによって変更および送信されたため、トランザクションの範囲内の複数のクエリによって異なるデータ値が返されます。
- ファントムリード(仮想リード):トランザクションが独立して実行されない場合に発生する現象。(つまり、あるトランザクションが他のトランザクションによって挿入されたデータを読み取るため、読み取りと書き込みの間に不整合が発生します)
ファントムリードとノンリピータブルリードの違い:
反復不可能な読み取りクエリはすべて同じデータ項目に関するものです (変更に焦点が当てられます)。一方、ファントム読み取りはデータのバッチ全体を対象とします (追加または削除に焦点が当てられます)。
解決策: 4 つの分離レベル
低いものから高いものまで、コミットされていない読み取り (コミットされていない読み取り)、コミットされた読み取り (コミットされた読み取り)、繰り返し読み取り可能 (繰り返し読み取り可能)、シリアル化可能 (シリアル化可能) です。
- コミットされていない読み取り: これは最も低いトランザクション分離レベルであり、別のトランザクションがこのトランザクションのコミットされていないデータを参照できるようになります。
- 読み取りコミット: トランザクションは、コミットされた後に別のトランザクションによってのみ読み取ることができ、別のトランザクションはトランザクションのコミットされていないデータを読み取ることができないことが保証されます。
- 読み取りの繰り返し: ダーティ読み取りと非反復読み取りを防止し、データを同時に読み取るときに、トランザクション内の複数のインスタンスが同じデータを確実に読み取るようにします。
- シリアル化: 最も高価ですが最も信頼性の高いトランザクション分離レベルであり、トランザクションは順次実行として処理されます。つまり、共有ロックが各読み取りデータ行に追加されます。
ダーティリード | 反復不可能な読み取り | ファントムリーディング | |
コミットされていない読み取り | 現れるかもしれない | 現れるかもしれない | 現れるかもしれない |
読み取りコミット | 表示されません | 現れるかもしれない | 現れるかもしれない |
繰り返し読む | 表示されません | 表示されません | 現れるかもしれない |
連載 | 表示されません | 表示されません | 表示されません |