免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3669 | 回复: 3
打印 上一主题 下一主题

遇到死锁怎么解决? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 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来看看!

论坛徽章:
0
2 [报告]
发表于 2002-04-11 16:34 |只看该作者
在多個事務中請保持加鎖解鎖的順序一致.

论坛徽章:
0
3 [报告]
发表于 2002-04-11 18:57 |只看该作者

继续

SQL中是自动加锁的,请问我如何知道它加解锁的顺序呢?

论坛徽章:
0
4 [报告]
发表于 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都得不到想要的鎖標誌,而一直佔用著資源就導致了死鎖.



我上面說的只是一種最常見的情況,你的情況不一定屬于這種.
但是導致死鎖的原因都是一樣的,就是因為多個事務時,對表操作的順序不一致.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP