1

设置是这样的:

每当我的网站发生错误时,都会在向管理员发送电子邮件时显示错误站点。

该网站显示了大量通过 AJAX 和 XML 每 15 秒自动更新的实时统计数据。但无论有多少用户,统计数据仅每 15 秒计算一次。这是由隐藏在 MSSQL 数据库中的时间戳完成的:

  • 网站检查时间戳是否超过 14 秒
  • 如果是,则更新时间戳并运行统计信息的计算并将它们保存到 XML
  • 最后循环遍历 XML 并向用户显示请求的统计信息

如果时间戳不超过 15 秒,则跳过第二步。

现在我的问题是,如果 2 个用户同时发出时间戳请求,那么系统在两个用户都尝试更新 XML 文档之前没有时间更新时间戳,导致其中一个用户失败错误信息:

msxml3.dll (0x80070020)
The process cannot access the file because it is being used by another process.
/file.asp, line 310

是否可以在尝试保存 XML 文档之前检查是否正在使用该进程?或者可能忽略这种明显的错误?

4

2 回答 2

1

我认为一个简单的锁将解决您的问题。

在经典的 ASP 中,可以通过设置顶级应用程序变量来使用应用程序对象来实现锁定。

在运行计算的代码中进行这些更改:

If Application("Calculation_Lock")<>"" Then
    Application("Calculation_Lock") = Now()
    'do the calculation...
    'calculation in progress...
    'calculation in progress...
    'calculation in progress...

    'when it's all done:
    Application("Calculation_Lock") = ""
End If

最初,应用程序级变量将为空,因此第一个用户将输入 If 语句,然后分配锁。当锁处于活动状态时,任何进一步的请求都将被忽略,即应用程序级变量已设置。

如果在计算过程中出现错误,锁可能会永远保持活动状态,因此为了安全起见,您可以比较值(即设置锁的时间)和当前时间,如果超过 X 秒/分钟手动解除锁定。

于 2012-11-05T07:43:28.307 回答
0

远离带有时间戳的数据库。

在这里查看代码;只需将持续时间设置为 15 秒,然后看看是否符合您的要求。

于 2012-11-04T18:19:38.943 回答