0

.Net 1.1 と SQL Server 2000 を使用してエンタープライズ アプリケーションを構築しています。読み取りコミット分離レベルを使用しています。しかし、非機能要件の変更により、非反復読み取りやファントムに対する対策が必要になりました。2 つのオプションが表示されます。

  1. 行のバージョン管理を導入して、行がトランザクション内で読み取られてから変更されたかどうかを確認します。これは、テーブルに VersionId 列を追加し、行が変更されるたびに値をインクリメントすることによって行われます。これで問題は解決しますが、すべてのストアド プロシージャとアプリケーションのデータ アクセス層を書き直す必要があります。

  2. SQL Server 2005 に移行し、スナップショット分離レベルを使用します。これにより、コードを書き直す手間が省けますが、いくつかの課題があります。スナップショット分離レベルは .Net 1.1 では不明であるため、手動で設定するには、サーバーへの余分な往復を行う必要があります。b. スナップショット分離レベルでは tempdb のスキーマを変更できないため、ストアド プロシージャで一時テーブルを使用することはできません。これを回避する方法がわかりません。

アイデアや提案は大歓迎です

4

2 に答える 2

1

2005/2008 にアップグレードして、read commit スナップショット オプションを有効にすることをお勧めします。有効にすると、コミットされた読み取りを要求するすべてのトランザクションで、ロックの代わりに行のバージョン管理が使用されます。また、完全なスナップショットの分離よりも、TempDB への影響が少なくなります。

一時テーブルとスナップショットに関してどのような問題がありますか? 問題なくスナップショット分離で一時テーブルを作成できます。私が知っている唯一の制限は、グローバル一時テーブルを使用している場合です。グローバル一時テーブルを機能させるには、tempDB をALLOW_SNAPSHOT_ISOLATION有効にするか、ロック ヒントをクエリに追加してステートメントを別の分離レベルに変更する必要があります。

于 2008-10-28T14:49:56.207 に答える
0

オプション#2に関するいくつかの考え:

サーバーへの余分なラウンドトリップを行う必要はありません。コマンドを既存のクエリ文字列の前に保留する、ストアド プロシージャに移動してそこに設定するなど、これを回避する 3 つの方法を考えることができます。
また、SQL Server 2005 をバイパスして SQL Server 2008 に直接移動することもできます。 、これは今出ています。

オプション #1 を使用する場合は、versionid 列にタイムスタンプ データ型を使用することを検討してください。

于 2008-10-14T18:16:21.437 に答える