如何忽略“进程无法访问该文件,因为它正被另一个进程使用”

时间:2012-11-04 18:10:43

标签: xml sql-server-2008 asp-classic

设置如下:

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

网站显示了很多通过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文档之前,是否可以检查是否正在使用该进程?或者可能忽略这种明显的错误?

2 个答案:

答案 0 :(得分:1)

我认为简单的锁定可以解决您的问题。

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

在运行计算的代码中进行以下更改:

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秒/分钟通过手动释放锁。

答案 1 :(得分:0)

使用时间戳离开数据库。

查看the code here;只需将持续时间设置为15秒,看看是否按照您希望的事情发生。