2010-12-05 10 views
3

SNAPSHOTアイソレーションを使用して、ロック、ブロックまたはダーティ/ファントムの読み取りを行わずにデータを一貫して読み取る問題はありますか?SerializableとSnapshotアイソレーションを同時に使用することの影響

ブロックされずに一貫性のあるデータを読み取ったり、更新をブロックするためには、読者(読み取り専用:Webデータ同期、リアルタイム監視ビューなど)が必要です。 SNAPSHOTをすべて使用していましたが、一貫性の失敗が多すぎて更新プロセスをSERIALIZABLEに切り替えました。

私はこれまでに読んだことがありますが、異なる分離レベルを同時に使用した場合の影響については完全に明確ではありません。私はlock compatibility matrixを見て、様々な情報を読んだ。大丈夫だと思いますが、大きな落とし穴について実践的な経験を積んだ人々からの賢明な指導に感謝します。

SERIALIZABLEトランザクションの書き込み中に、読者にスナップショット分離を使用する際に問題はありますか? SERIALIZABLEトランザクションをブロックする状況はありますか? SNAPSHOTとREAD COMMITTED(READ_COMMITTED_SNAPSHOT ON)を使用する利点はありますか?

おかげで、大幅SNAPSHOT分離レベルの下で行わ

答えて

4

読み込み:-)理解どのような援助は、バージョンストアから任意の変更されたデータを読み出します。そのように影響を受けるのはのみです。書き込みはすべてのように、すべての分離レベルで同じように動作します()。したがって、SNAPSHOTの読取りは、コンカレント・トランザクションの分離レベルに関係なく同じ方法で動作します。

READ_COMMITTED_SNAPSHOT ONはREAD COMMITTEDをSNAPSHOTとして動作させます。実際にはSNAPSHOTです:READ_COMMITTED_SNAPSHOTは、コード変更なしでアプリケーションをSNAPSHOTに移植するための素早い方法として提供されました。だから、最初の段落で言われたすべてが適用されます。

+0

ありがとうございます! SNAPSHOT分離の読み取りによってSERIALIZABLEトランザクションがブロックされる状況がありますか? (最初はNOLOCKヒントを使用すると思っていましたが、SNAPSHOTのほうがリスクが高いという解説を読んでください) – mos

+1

SNAPSHOTトランザクションが書き込みを行う場合、SERIALIZABLEトランザクションを含むすべてのトランザクションをブロックできます。 SNAPSHOTトランザクションが厳密に読み取ると、* locks *の他のトランザクションはブロックされません。他のタイプのリソース競合(ロックされていないものにブロックする)がありますが、これはメモリーの消耗や通常の操作ではない極端なケースです。いずれにしても、SNAPSHOTの読み込みは、あなたの最善の選択肢です。 –

関連する問題