代码之家  ›  专栏  ›  技术社区  ›  VVS

同步数据访问

  •  0
  • VVS  · 技术社区  · 14 年前

    几年前,我为我的同事构建了一个Excel文件,它显示了来自外部ODBC数据源的大量数据。数据被分为不同工作表中的许多数据表。该文件还包含一个允许用户更新数据的按钮。

    由于从外部源访问数据的速度非常慢,我实现了一些缓存逻辑,在我们的SQL Server的外部表中存储了一些不太可能更改的结果部分,并做了一些魔术来保持数据同步。Excel文件本身只访问SQL Server。每个数据表都使用一个存储过程来获取部分数据。

    快进5年。Excel文件的大小已经增加,包含的工作表和数据太多,以致我们的Excel(仍然是2003版)遇到了问题。所以我的同事把文件分成两半。

    现在的问题是,两个Excel文件都包含更新数据的逻辑,当另一个用户正在更新文件2时,用户可能单击文件1中的更新按钮。

    这就是更新逻辑变得疯狂并产生垃圾的地方。

    两个Excel文件只需要更新一次,因为它会更新两个文件中显示的所有数据。它很贵,能用5到15分钟。

    我也可以将更新运行分为两部分,但这不会使其更快,而且更新两个文件需要两倍的时间。

    我想的是某种互斥:用户A单击更新按钮,更新运行开始。用户B也希望更新,但是(vba/sproc)逻辑检测到已经在运行更新,并等待更新完成。

    2 回复  |  直到 9 年前
        1
  •  1
  •   Mitch Wheat    14 年前

    您可以在具有可序列化隔离级别的事务中执行更新;您的更新代码需要检测和处理SQL Server错误1205(并向用户报告正在进行另一个更新)。

    或者,向每一行添加一个rowversion时间戳,并且仅在加载后未更改的行中更新该行。

        2
  •  1
  •   smirkingman    14 年前

    但是当A完成后,B将运行更新“不做任何事”。

    相反:当单击更新时,调用一个异步触发更新的存储过程。 当更新开始时,它会查看最后一次运行自己的时间,如果不到x分钟,则退出。