1

我在 .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() ,它也使用事务。有什么与缓存相关的东西可以在这里提供帮助吗?因为我必须在这里发布的代码量是巨大的,我什至不允许这样做。

我尝试了两件事,并且在这两种情况下都有效-

  1. 添加了一个 500ms 的 thread.sleep
  2. 在 doTask() 中调试并暂停对 updateData() 的调用一秒钟
4

2 回答 2

4

我知道 SQL Server 缓存查询结果集

这是不正确的。SQL Server 不会缓存查询结果,任何其他关系数据库也不会为此缓存。

您需要提供一个清晰的示例来说明问题所在、表结构、您运行的查询、预期结果和实际结果。事实上,这个问题是无法回答的。

根据您对结果缓存的评论,我不相信您了解事务和隔离。假设您的代码(根本没有显示)至少执行查询,而不是一次又一次地显示相同的本地缓存数据,您所描述的可能是由于更新丢失(应用程序中的代码不正确)以及通过在快照隔离下操作而不了解行为。

于 2013-07-26T08:52:20.640 回答
0

Sql server 不会缓存结果,它会缓存生成结果的计划。你能提出 UpdateData 调用的查询吗?似乎交易已经开始但尚未提交?或者,如果您正在运行相同的 UpdateData(),它可能会在表上创建类似锁的条件,从而阻止其他实例更新。

于 2013-07-26T09:44:10.857 回答