Chinaunix

标题: 遇到死锁怎么解决? [打印本页]

作者: seapen    时间: 2002-04-11 16:14
标题: 遇到死锁怎么解决?
自己写了一个存储过程用来往某个表中插入数据
而那个表也做了一个for inserted的触发器用来检测所插入的数据是否满足特定的条件。
当执行存储过程时出现死锁,
使用sp_lock查看锁信息,得到如下结果:
spid   dbid   ObjId       IndId  Type Resource         Mode     Status
------ ------ ----------- ------ ---- ---------------- -------- ------
8      7      0           0      DB                    S        GRANT
8      7      1922105888  1      PAG  1:361            IS       GRANT
8      7      2136394680  1      PAG  1:2056           IX       WAIT
8      7      997578592   0      TAB                   IS       GRANT
8      7      2136394680  0      TAB                   IX       GRANT
8      7      1922105888  0      TAB                   IS       GRANT
8      7      1922105888  1      KEY  (040004000000)   S        GRANT

对像为2136394680的页级排它锁处于等待状态,我不太清楚是什么原因造成死锁的。
我修改我的存储过程,在每一个insert或update语句执行时都给了一个事务如:
begin tran mytran
insert statement
commit tran mytran
但问题依旧,
请高手赐教!!!
欢迎zhuzhichao , xmmhacker来看看!
作者: zhuzhichao    时间: 2002-04-11 16:34
在多個事務中請保持加鎖解鎖的順序一致.
作者: seapen    时间: 2002-04-11 18:57
标题: 继续
SQL中是自动加锁的,请问我如何知道它加解锁的顺序呢?
作者: zhuzhichao    时间: 2002-04-12 10:39
SQLServer在執行sql語句時會自動給表加鎖.
執行結束後會將鎖標誌解除.

因此,在多個事務時,應保持對表操作的順序一致.

倘若是這樣這樣就可能會產生死鎖.

比方說事務1:

select * from A ......

select * from B ......

......


事務2:

select * from B ......

select * from A ......

......


然後一個進程啟動了事務1,成功的鎖住了A表,正在試圖獲取B的鎖標誌.
而另外一個進程啟動了事務2,成功的鎖住了B表正在試圖獲取A的鎖標誌.

這樣這兩個process都得不到想要的鎖標誌,而一直佔用著資源就導致了死鎖.



我上面說的只是一種最常見的情況,你的情況不一定屬于這種.
但是導致死鎖的原因都是一樣的,就是因為多個事務時,對表操作的順序不一致.




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2