设置如下:
每当我的网站发生错误时,系统会在向管理员发送电子邮件时显示错误网站。
网站显示了很多通过AJAX和XML每15秒自动更新的实时统计数据。但统计数据每15秒只计算一次,无论有多少用户。 这是通过隐藏在MSSQL数据库中的时间戳来完成的:
如果时间戳不超过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文档之前,是否可以检查是否正在使用该进程?或者可能忽略这种明显的错误?
答案 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秒,看看是否按照您希望的事情发生。