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