【问题标题】:Sql server Caching issueSql server 缓存问题
【发布时间】:2013-07-26 09:55:08
【问题描述】:

我在 .Net 3.5 和 SqlHelper 上使用 Sql Server 2008 R2 与 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() 被调用,它也使用事务。有什么与缓存相关的东西可以在这里提供帮助吗?因为我必须在这里发布的代码量非常大,我什至不允许这样做。

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

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

【问题讨论】:

  • 不,还有其他事情正在发生。贴一些代码。

标签: c# .net sql-server caching


【解决方案1】:

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

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

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

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

【讨论】:

  • 顺便说一句:MySQL 确实 cache actual results.
  • @PankajKohli 缓存结果和buffer pool 有很大区别。
  • @MartinSmith 我知道我应该说'任何 严重 关系数据库......' 然后我总是可以忽略任何反例 :) 说真的,虽然我不知道MySQL 的行为(或者如果我知道我忘记了......)。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    相关资源
    最近更新 更多