簡単な質問ですか?
READ_COMMITTED_SNAPSHOT
がデフォルトでオンになっていないのはなぜですか?
下位互換性、パフォーマンス、またはその両方のいずれかだと思いますか?
[編集]スナップショット分離レベルではなく、READ_COMMITTED 分離レベルに関連する効果に関心があることに注意してください。
保持するロックが少なく、まだコミットされていない行を読み取らないため、これが重大な変更になるのはなぜでしょうか?
簡単な質問ですか?
READ_COMMITTED_SNAPSHOT
がデフォルトでオンになっていないのはなぜですか?
下位互換性、パフォーマンス、またはその両方のいずれかだと思いますか?
[編集]スナップショット分離レベルではなく、READ_COMMITTED 分離レベルに関連する効果に関心があることに注意してください。
保持するロックが少なく、まだコミットされていない行を読み取らないため、これが重大な変更になるのはなぜでしょうか?
デフォルトでスナップショットをオンにすると、大部分のアプリケーションが壊れます
アプリケーションの「大部分」が壊れるかどうかは不明です。または、特定や回避が困難な方法で多くのアプリケーションを破壊する場合。SQL Server のドキュメントには、READ COMMITTED
とREAD COMMITTED SNAPSHOT
の両方が の ANSI 定義を満たしていると記載されていますREAD COMMITTED
。(ここに記載: http://msdn.microsoft.com/en-us/library/ms189122.aspx )したがって、コードが文字どおりの ANSI で必要な動作以外に依存しない限り、理論的には、わかった。
厄介なことに、ANSI 仕様は、ダーティ リード、あいまい/反復不可能なリードなど、人々が実際に意味するものと一般的に考えていることのすべてを捉えているわけではありません。READ COMMITTED SNAPSHOT
また、 では発生する可能性があり、 では発生しない異常 (ANSI 定義で許可されている)がありますREAD COMMITTED
。例については、http://www.jimmcleod.net/blog/index.php/2009/08/27/the-potential-dangers-of-the-read-committed-snapshot-isolation-level/ を参照してください。
分離レベル間の違いに関する詳細な情報については、http://www.cs.umb.edu/cs734/CritiqueANSI_Iso.pdf から始めてください(READ_COMMITTED_SNAPSHOT
この文書が書かれた時点では存在しませんでしたが、他のレベルはこの文書でカバーされています)。
両方。ほとんど互換性。
デフォルトでスナップショットをオンにすると、古いブロック動作を期待する大多数のアプリケーションが機能しなくなります。スナップショットは、バージョン ストアに tempdb を多用し、パフォーマンスへの影響はかなり測定可能です。
これにより、デフォルトのロック戦略が、Sybase /SQLServerファミリが永遠に機能していた方法から変更されます。それは私のすべてのアプリケーション、私の店で知っているすべてのアプリケーションを壊し、多くの重要なデータを破壊するでしょう。
ウィキペディアの記事を 完全に読んでください:銀行アプリの背後にあるコードでこの分離モデルを使用しますか?
したがって、一般に、スナップショットアイソレーションは、潜在的な落とし穴や考えられる解決策を理解していない可能性のあるユーザーに、重要な制約を維持するという問題の一部をもたらします。この転送の利点は、パフォーマンスが向上することです。
これは、ほとんどのデータベース設計と同様に妥協点です。私の場合、ロック待機/デッドロック(まれ)を、より簡単で「すぐに使える」データ整合性の代償として扱うことができます。スナップショットアイソレーションを解決策と見なす問題や問題はまだ発生していません。