安装PHP程序遇到问题求助!!!
发布网友
发布时间:2022-04-20 07:37
我来回答
共1个回答
热心网友
时间:2022-04-20 09:07
阻塞得原因:
在永久连接中使用数据表锁时,如果脚本不管什么原因无法释放该数据表锁,其随后使用相同连接的脚本将会被永久的阻塞,使得需要重新启动 httpd 服务或者数据库服务。另外,在使用事务处理时,如果脚本在事务阻塞产生前结束,则该阻塞也会影响到使用相同连接的下一个脚本。不管在什么情况下,都可以通过使用 register_shutdown_function() 函数来注册一个简单的清理函数来打开数据表锁,或者回滚事务。或者更好的处理方法,是不在使用数据表锁或者事务处理的脚本中使用永久连接,这可以从根本上解决这个问题(当然还可以在其它地方使用永久连接)。
首先,判断阻塞发生在哪个表上.
方法如下:
1. 使用sp_lock进行察看,如果 输出信息 locktype 中包含 -blk 字符,说明当前表 table_id 的 page 上的锁对其他进程造成了阻塞
2. 通过察看 master..syslocks 系统表
例
id dbid page type spid class fid context row loid
----------- ------ ----------- ------ ------ ------------------------------ ------ ------- ------ -----------
512004855 6 0 3 13 Non Cursor Lock 0 0 0 26
512004855 6 0 4 12 Non Cursor Lock 0 0 0 24
512004855 6 0 3 10 Non Cursor Lock 0 0 0 20
512004855 6 793 261 13 Non Cursor Lock 0 8 0 26
从spid可知道当前阻塞及被阻塞的进程,并且从type字段可以知道锁的类型,见下表:
1 0x1 排它表锁
2 0x2 共享表锁
3 0x3 排它意图锁
4 0x4 共享意图锁
5 0x5 排它页锁
6 0x6 共享页锁
7 0x7 更新页锁
8 0x8 排它行锁
9 0x9 共享行锁
10 0xA 更新行锁
11 0xB 共享下一键锁
256 0x100 锁在阻塞另一个进程
512 0x200 请求锁
所以你可以通过下面的查询获得阻塞表信息
select b.name as dbname,a.id as table_id,page,spid from syslocks a,sysdatabases b
where b.dbid = a.dbid
and a.type & 256 = 256
你也可以写成一个存储过程,不过一定要在master中执行。
其次,优化程序,解决这个死锁.