スナップショット分離とは何ですか?
スナップショット分離は、トランザクション処理のプロパティであり、トランザクションで行われるすべての読み取りが同じデータベース「スナップショット」を参照することを保証するデータベースです。 これは、更新が他の同時更新と競合しない場合、トランザクションがリクエストを正常に処理することをコミットすることを意味します。 スナップショット分離は、マルチバージョン同時実行性の制御アルゴリズムであり、同時実行性で一般的に発生する問題を回避する分離レベルを提供します。 この分離は、いくつかの異なる構造化照会言語(SQL)サーバーによって実装されており、最小限のシリアル化の異常で動作します。 ただし、スナップショット分離では、サーバーでの完全なシリアル化が保証されません。
多くの主要なデータ管理システムには、シリアル化できないデフォルトの分離レベルが含まれており、多くの場合、スナップショット分離なしでシリアル化の異常が発生します。 これにより、大規模なシステムでは毎日多数の分離エラーが発生し、特にデータのウェアハウスアプリケーションで見られるデータが破損する可能性があります。 システムがこの状態で動作する理由は、重大なエラーが発生しない場合、低い分離レベルで実行されるアプリケーションが効率を改善する可能性があるためです。 システムにスナップショット分離を含めると、これらの異常が減少し、操作時間と発生するエラーの量を考慮すると、効率がさらに向上します。
一部のデータベースは完全な直列化可能性とは対照的にスナップショット分離を提供しますが、このタイプの分離を利用するデータベース内で発生する可能性のある異常もあります。 これらの異常は、一貫性のインターリーブを維持する、または交互の層に配置されるトランザクションのため、データの一貫性違反につながる可能性があります。 問題を解決し、これらのような異常を防ぐ1つの方法は、人工ロックと競合する更新を導入してアプリケーションを操作し、その後、トランザクションの各ペア間の競合を分析することです。 ただし、これらの異常を解決する別の方法は、データベースシステムの同時実行制御のアルゴリズムを変更して、実行時にスナップショット分離の異常を自動的に検出および防止することです。 これは重要なアプリケーションまたは任意のアプリケーションに対して実行できますが、シリアライズ可能な分離を提供します。
新しいSQLサーバーでは、特定のアプリケーションの同時実行性を強化するために、新しいレベルの分離と新しいレベルのスナップショット分離を導入できました。 SQLサーバーの初期バージョンが並行性の基礎としてロックを使用していた場合、スナップショット分離はパフォーマンスの向上を目的とした行バージョン管理の強化に依存しています。 読み取りまたは書き込みをブロックするシナリオを回避することにより、このパフォーマンスを改善します。