1

私はSql Server 2008 R2と2008、.Net 3.5およびSqlHelperでC#を使用しています。

updateData(int id) などのメソッドは、「id」に関連するデータをロードし、多くの計算と処理を行い、データを再コミットします。一連のタスクを実行する別のプログラム doThings(int id) があり、各タスクは「id」に関連するデータを操作し、トランザクション内でそのデータをコミットします。これらのタスクの一部は、コミット後に updateData(int id) を呼び出していますが、updateData(int id) は最新のコミットに従ってデータを更新していません。しばらくして updateData(int id) を再実行すると、正常に更新が完了します。

より明確にするために、プログラムが行っていることは次のとおりです-

doTask(int id) //updates some table related to id and calls updateData()
doTask(int id) //updates some table related to id and calls updateData()
doTask(int id) //updates some table related to id and calls updateData()
doTask(int id) //updates some table related to id and calls updateData()
...

出力 - データは更新されません

しばらくして -

updateData() //recalculates and updates the data

出力 - データが更新されます

SQL Server がクエリの結果セットをキャッシュしていることは知っています。ただし、キャッシュにあるテーブルの一部を更新した場合、結果セットを再作成するべきではありません。私はこれをさまざまな環境 (テストと本番) で試しましたが、あまり助けはありませんでした。

各 doTask(int id)は Transactions を使用してデータベースを更新しており、そのトランザクションは updateData の最後の呼び出しが最終的に行われたようにデータを更新しない sans で完了します。そのトランザクションが完了すると、トランザクションも使用する updateData() が呼び出されます。ここで役立つキャッシングに関連するものはありますか? ここに投稿しなければならないコードの量は膨大であり、それを行うことさえ許可されていないためです。

私は2つのことを試しましたが、両方のケースで機能しました-

  1. 500ms の thread.sleep を追加
  2. doTask() の updateData() の呼び出しをデバッグして、ほんの 1 秒間延期しました
4

2 に答える 2

4

SQL Server がクエリの結果セットをキャッシュすることを知っています

これは正しくありません。SQL Server はクエリ結果をキャッシュしません。また、他のリレーショナル データベースもキャッシュしません。

問題の内容、テーブル構造、実行するクエリ、期待される結果と実際の結果の明確な例を提供する必要があります。そのままでは、この質問は答えられません。

結果のキャッシュに関するコメントに基づいて、トランザクションと分離を理解しているとは確信していません。あなたのコード (まったく表示されていません) が、ローカルにキャッシュされた同じデータを何度も表示するのではなく、少なくともクエリを実行すると仮定すると、説明した内容は更新の損失 (アプリのコードが正しくない) によって説明される可能性があります。スナップショット分離の下で動作し、動作を理解していない。

于 2013-07-26T08:52:20.640 に答える
0

Sqlサーバーは結果をキャッシュせず、結果を生成する計画をキャッシュします。UpdateData が呼び出すクエリを教えてください。トランザクションが開始されたが、コミットされていないように思われますか? または、同じ UpdateData() を実行している場合、テーブルにロックのような条件が作成され、他のインスタンスが更新されない可能性があります。

于 2013-07-26T09:44:10.857 に答える