日期:2014-02-24  浏览次数:20850 次


询问:
 

首先我致电通联无限的客服,他们态度很好,说有可能是进程阻塞造成的服务器不能访问。果然他们帮我回收一下服务器资源就能访问了。

研究:
 

到底是什么造成了我的服务器突然死锁或进程阻塞呢?我研究了很久,最终得出的结论是:由于统计系统的访问量过大,同时查询更新数据库的人数太多,而造成了ASP突然不能访问。

 

那么现在的原因可能是这样:
由于每一次查询更新数据库都要向系统请求的资源,而所请求的资源没有及时关闭或者释放而造成了进程阻塞.
 

用户Q访问表A(锁住表A),然后又访问表B,此时用户W访问表B(锁住表B),然后企图访问表A,这时用户Q由于用户W已经锁住表B,Q必须等待用户W释放表B,才能继续,同样用户W要等用户Q释放表A才能继续,于是产生死锁。
 

就好比我把我家锁上了,然后拿着钥匙跑到你家,然后你把我反锁在了你家然后又企图进我家。这样我出不来你也进不去,于是就无限等待下去吧。
或者用户A读一条纪录E,然后修改该条纪录E,但没有锁定,此时用户B也修改该条纪录E的时候容易造成死锁。这主要是由于数据库的锁定类型设定不当,导致资源竞争严重,从而造成死锁.
 

拙见:
 

怎么解决呢?
 

1,我觉得就是要在程序中注意习惯性使用xxx.close:set xxx=nothing这样的语句,及时释放服务器资源。最开始我那个SXNA1.3就没有及时释放服务器资源而导致了好多的服务器出现假死。后来基本修正了的说。
 

2,我觉得是不是在数据库的锁定类型上尝试使用adLockPessimistic悲观锁定方式,因为conn.execute的默认锁定方式是ADLOCKREADONLY,这个在同时又大量的用户访问查询更新数据库的时候容易造成死锁。
 

3,使用MSMQ来控制ASP进程,解决进程死锁问题,这个在网络上有大量的教程,我就不赘述了。
总之造成这个问题的应该是程序的BUG。

 

我的解决方法是最最痛快的解决办法,不使用站内的统计,使用站外的统计.现在站外的免费流量统计也不错,反向链接也能看得很清楚,只不过需要点进去看而已。