私は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つのことを試しましたが、両方のケースで機能しました-
- 500ms の thread.sleep を追加
- doTask() の updateData() の呼び出しをデバッグして、ほんの 1 秒間延期しました