我在 .Net 3.5 和 SqlHelper 上使用 Sql Server 2008 R2,vs 2008,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)都使用事务来更新数据库,并且该事务已完成,而最后一次调用 updateData 将不会像最终那样更新数据。一旦其事务完成,就会调用 updateData() ,它也使用事务。有什么与缓存相关的东西可以在这里提供帮助吗?因为我必须在这里发布的代码量是巨大的,我什至不允许这样做。
我尝试了两件事,并且在这两种情况下都有效-
- 添加了一个 500ms 的 thread.sleep
- 在 doTask() 中调试并暂停对 updateData() 的调用一秒钟