SQL Server并发问题

时间:2011-07-01 14:16:21

标签: sql-server-2005

我的报告位于视图之上。基础表的视图每15分钟更新一次,更新周期大约需要1-2分钟,在此期间,如果我运行报告,我的报告中的值会出错。是否有一种方法可以应用某种锁在视图上,以便我可以在更新完成后获取报告并避免报告中的脏数据。如果此问题还有其他解决方案,请告诉我

谢谢, 拉维

3 个答案:

答案 0 :(得分:1)

我会考虑使用不同的方法来更新基础表。不要在1-2分钟内更新这些表,而是在另一个模式中创建“shadow”表。 (并且有第三个用于临时保留的模式。)这允许您处理用户无法看到的表,然后使用元数据操作切换它们。然后你可以这样做:

  1. 截断/重新填充影子表(2分钟,或者可能更少,没有争用)
  2. 开始一项交易(亚毫秒)
  3. 使用ALTER SCHEMA ... TRANSFER(sub-millisecond)
  4. 将主表移动到保留架构
  5. 将影子表移至dbo架构(亚毫秒)
  6. 将主表移动到影子架构(亚毫秒)
  7. 提交事务(sub-millisecond)
  8. (可选)截断影子表以恢复一些空间(亚秒)
  9. 此解决方案的一个缺点是您将拥有两组统计数据,索引等。对于统计数据,如果数据只是增加而没有显着变化,那么你应该没问题。

    亚当·海恩斯(Adam Haines)在这里对这种方法(我几年前向他展示过)进行了非常详尽的论述:

    http://jahaines.blogspot.com/2009/10/locking-table-while-it-is-being-loaded.html

答案 1 :(得分:1)

与Aaron Bertrand的答案类似,但使用SYNONYMs:

在这种情况下,您有两个同义词:一个用于“要加载的表”,另一个用于“要查询的表”

可以将各种CREATE语句包装在具有EXECUTE AS OWNER的存储过程中以升级权限。

根据你对Aaron的答案的评论,你有一些切换方式。增加并发性的唯一方法是使用多个表。

答案 2 :(得分:-1)

您是否考虑过以可重复读取或序列化隔离模式检索报告数据?