2013-07-26 77 views
1

我在.Net 3.5和SqlHelper上使用Sql Server 2008 R2和VS 2008 C#。Sql server缓存问题

一种方法,比如updateData(int id)加载一些与“id”有关的数据,做了大量的计算和处理并重新提交数据。有一个单独的程序doThings(int id),它执行一组任务,其中每个任务操作与“id”相关的数据,然后在一个事务中提交该数据。其中一些任务在提交后调用updateData(int id),但是,updateData(int id)不按照最新的提交更新数据。过了一会儿,如果我重新运行updateData(int id),那么更新就完成了,因为它应该。

为了使它更清楚,这里就是该程序是doing-

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(IN​​T ID)的是利用交易来更新数据库和交易完成SANS它,因为它没有最终的了updateData最后一次通话将不会更新数据。一旦交易完成,updateData()被调用,其也使用交易。有什么与缓存有关的,可以在这里帮助吗?因为我必须在这里发布的代码量非常大,我甚至不允许这样做。

我想两两件事,并在这两个情况下─

  1. 工作增加500毫秒
  2. 调试的Thread.sleep代码和刚刚第二呼叫举行了到了updateData()在doTask()
+0

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

回答

4

我知道SQL服务器缓存查询结果集

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

您需要提供一个清楚的问题示例,表结构,运行的查询,预期结果和实际结果。因为这个问题是无法回答的。

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

+1

BTW:MySQL会[缓存实际结果。](http://dev.mysql.com/doc/refman/5.1/en/query-cache.html) –

+0

@PankajKohli缓存结果和[缓冲池](http://msdn.microsoft.com/en-us/library/aa337525(v = SQL.105)的.aspx)。 –

+2

@MartinSmith我知道我应该说'任何*严重的*关系数据库...',然后我总是可以解雇任何反例。:)虽然我不知道MySQL的行为(或者如果我知道我忘记了。 ..)。 –

0

Sql服务器不会缓存结果,它会缓存生成结果的计划。 你可以忍受UpdateData调用的查询吗?看起来也许交易已经开始但没有兑现? 或者如果您正在运行相同的UpdateData(),它可能会在表上创建类似条件的锁,以防止其他实例更新。