【问题标题】:SQL Server Concurrency issueSQL Server 并发问题
【发布时间】:2011-09-26 19:24:58
【问题描述】:

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

谢谢, 拉维

【问题讨论】:

    标签: sql-server-2005


    【解决方案1】:

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

    1. 截断/重新填充影子表(2 分钟,或者在没有争用的情况下可能更短)
    2. 启动事务(亚毫秒)
    3. 使用 ALTER SCHEMA ... TRANSFER(亚毫秒)将主表移动到持有模式
    4. 将影子表移动到 dbo 架构(亚毫秒)
    5. 将主表移动到影子模式(亚毫秒)
    6. 提交事务(亚毫秒)
    7. (可选)截断影子表以恢复一些空间(亚秒级)

    此解决方案的一个缺点是您需要维护两组统计信息、索引等。对于统计数据,如果数据只是在增加而没有发生实质性变化,则应该没问题。

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

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

    【讨论】:

    • 嗨亚伦,感谢您的解决方案,但我对数据库没有任何权利并遵循这种方法。是否有任何其他方法可以使用“选择语句”来实现,因为我只有具有对数据库的读取权限。谢谢
    【解决方案2】:

    与 Aaron Bertrand 的回答类似,但使用同义词:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我不知道可序列化是否是一个好的答案。我怀疑 OP 试图增加并发性,而不是消除它。 :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 1970-01-01
      相关资源
      最近更新 更多