SQL死锁并无法KILL会话

单线程加锁 2011-04-06 02:25:53
我遇到了这样的情况,数据库死锁了,而且KILL那个会话的时候总是提示回滚了100%,很久了一直这样。
请教高手应该如何解决。

引起数据库死锁的是: 89进程号,其执行的SQL语法如下
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED Select top 20000 u1.FDetailID as FListEntryID,(u1.FQty-u1.FAllHookQTY) as FHookQTY,v1.FVchInterID as FVchInterID,v1.FTranType as FTranType,v1.FInterID as FInterID,u1.FEntryID as FEntryID,v1.Fdate as Fdate。。。。
进程号SPID:7被进程号SPID:79阻塞,其当前进程执行的SQL语法如下
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED Select top 20000 u1.FDetailID as FListEntryID,(u1.FQty-u1.FAllHookQTY) as FHookQTY,v1.FVchInterID as FVchInterID,v1.FTranType as FTranType,v1.FInterID as FInterID,u1.FEntryID as FEntryID,v1.Fdate as Fdate。。。。

kill 89
SPID 89: 正在进行事务回滚。估计回滚已完成: 100%。估计剩余时间: 0 秒。
kill 79
SPID 89: 正在进行事务回滚。估计回滚已完成: 100%。估计剩余时间: 0 秒。




...全文
1278 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
单线程加锁 2011-04-07
  • 打赏
  • 举报
回复
谢谢大家,我结贴了。
貓哥是個傳說 2011-04-07
  • 打赏
  • 举报
回复
死鎖的問題確實麻煩,馬克學習一下。。
唐诗三百首 2011-04-07
  • 打赏
  • 举报
回复
出现状况时用以下语句排查问题,

查79,89进程信息 --> 正常是2笔结果.
select spid,blocked,waittype,lastwaittype
from master.dbo.sysprocesses
where spid in (79,89)

查被79,89阻塞的进程信息 --> 正常是0笔结果.
select spid,blocked,waittype,lastwaittype
from master.dbo.sysprocesses
where blocked in (79,89)

查被79,89进程锁定的信息
SELECT * FROM master.dbo.syslockinfo where REQ_SPID
  • 打赏
  • 举报
回复
菜鸟路过留声,我的服务器锁表异常频繁,一天一次或更多,客户端是人家开发的,我又是数据库生手,头都大了。学习了
单线程加锁 2011-04-06
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 obuntu 的回复:]
呵呵,找个时间重启下SQL Server的服务吧。
以前也遇到过这个问题,找了好久也没找到解决方法。
只好重启了。
[/Quote]
现在重启了,这个问题还是解决了。不过好的方法还是没找到。
obuntu 2011-04-06
  • 打赏
  • 举报
回复
呵呵,找个时间重启下SQL Server的服务吧。
以前也遇到过这个问题,找了好久也没找到解决方法。
只好重启了。
单线程加锁 2011-04-06
  • 打赏
  • 举报
回复
服务我关了再开也还不行。
重启了MSDTC也还一样。。。
liuyinbo0109 2011-04-06
  • 打赏
  • 举报
回复
有可能是客户端已经死机了,所以Kill SPID总是执行不成功,不需要重启SQLServer,只需要重启下MSDTC即可解锁
唐诗三百首 2011-04-06
  • 打赏
  • 举报
回复
对了哦,SQL2000企业管理器里,进程状态是没有自动刷新的,可能实际已不存在了,
点击刷新就没有阻塞了.
单线程加锁 2011-04-06
  • 打赏
  • 举报
回复
谢谢帮忙
我这个死锁好象有好几天了。。。。
上面显示的3-24号开始锁的。。只查了2W条应该不是数据量的问题
单线程加锁 2011-04-06
  • 打赏
  • 举报
回复
用select spid,blocked,waittype,lastwaittype
from master.dbo.sysprocesses
where spid in (79,89)

唐诗三百首 2011-04-06
  • 打赏
  • 举报
回复
以下2句查询是不同的,
select spid,blocked,waittype,lastwaittype
from master.dbo.sysprocesses
where spid in (79,89)
--> 正常是2笔结果.

select spid,blocked,waittype,lastwaittype
from master.dbo.sysprocesses
where blocked in (79,89)
--> 正常是0笔结果.
唐诗三百首 2011-04-06
  • 打赏
  • 举报
回复
怀疑是目标表的数据量太大,查询要执行很久很久,而产生的"假死锁"现象.
请看一下数据量是不是很大,且相关字段没有建索引.
单线程加锁 2011-04-06
  • 打赏
  • 举报
回复
查询结果是这样啊:
SQL code
select * from master.dbo.sysprocesses where blocked in (79,89)

79 0 0x0000 NETWORKIO
89 0 0x0200 EXCHANGE
89 0 0x0046 MISCELLANEOUS
89 0 0x0046 MISCELLANEOUS
[/Quote]
单线程加锁 2011-04-06
  • 打赏
  • 举报
回复
图片:
唐诗三百首 2011-04-06
  • 打赏
  • 举报
回复
确认 select * from master.dbo.sysprocesses where blocked in (79,89)
结果是空吗?

提供的SQL语句到"v1.Fdate as Fdate"就没了,没办法,SQL工具只能看到这么长的SQL语句.
单线程加锁 2011-04-06
  • 打赏
  • 举报
回复
谢谢你的回复

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
Select top 20000 u1.FDetailID as FListEntryID,(u1.FQty-u1.FAllHookQTY) as FHookQTY,v1.FVchInterID as FVchInterID,v1.FTranType as FTranType,v1.FInterID as FInterID,u1.FEntryID as FEntryID,v1.Fdate as Fdate
唐诗三百首 2011-04-06
  • 打赏
  • 举报
回复
从结果看, 79 & 89没有被阻塞(即blocked=0).

不过79 & 89也不可能阻塞其他进程,因为有READ UNCOMMITTED.
用select * from master.dbo.sysprocesses where blocked in (79,89)查看,正常应该是空.

可能与后面的select语句有关,请贴出来?
单线程加锁 2011-04-06
  • 打赏
  • 举报
回复

79 0 0x0000 NETWORKIO
89 0 0x0200 EXCHANGE
89 0 0x0046 MISCELLANEOUS
89 0 0x0046 MISCELLANEOUS
唐诗三百首 2011-04-06
  • 打赏
  • 举报
回复
楼主的现场还在吗?执行以下查询,把结果贴来看看,

select spid,blocked,waittype,lastwaittype
from master.dbo.sysprocesses
where spid in (79,89)
加载更多回复(9)
目录 1. DB2 1.1. 创建一个返回结果集的存储过程\自定义函数 12 1.2. DB2 高级应用 14 1.3. 删除表数据时候出现日志已满的解决方法 24 1.4. DB2快照函数全解析 25 1.5. DB2中的22个命令小技巧 26 1.6. DB2实现类型ORACLE的一些功能 29 1.7. 字符数据类型转换的时候需要注意的问题(原) 30 1.8. 本地谓词的使用注意(原) 31 1.9. windows/Linux或Unix下查看DB2端口号 31 1.10. 尽量让fetch first n row only或者分页的时候结合optimize for n rows使用(原) 32 1.11. 格式化字符串(原) 33 1.12. 10大DB2优化技巧 33 1.13. 使用DB2的整数转换浮点小数时注意(原) 41 1.14. 使用递归制造测试数据(原) 42 1.15. 尽量使用自定义函数来代替存储过程 42 1.16. VALUES(…) 与 VALUES …的区别(原) 44 1.17. DB2的表锁和行锁 45 1.18. 修改表结构后不允许对表进行任何操作(原) 57 1.19. 解决暂挂表(原) 58 1.20. DB2LOOK语法及使用 58 导出表结构的表结构脚本 59 1.21. DB2的函数大全 64 1.22. DB2数据库为单个会话锁定技巧 64 1.23. EXISTS和COUNT(*)的使用(原) 68 1.24. 如果表比较大,进行COUNT的时候,可选择COUNT_BIG(*) 69 1.25. 序列(SEQUENCE) (原) 69 1.26. 数据的导入和导出 69 1 加载数据: 69 2 卸载数据: 70 3 在Load过程中使用的Exception 表有何作用,该如何创建?(原) 70 4如何导出(EXPORT),导入(LOAD)包含由公式生成字段的表 70 5 LOAD命令和自生成列值 72 6 用load命令和identityoverride参数向有identity列的表中装载数据后的注意事项 74 1.27. 利用快照函数查询数据库服务器本地以及远程的连接数 74 1.28. 查看SQL的执行计划 74 1.29. 如何查看数据库ABC的配置文件的内容? 75 1.30. 查看是哪张表挂起(原) 75 1.31. 导出(导入)数据库的所有表数据(db2move) 75 1.32. 备份数据库,恢复数据库 75 1.33. 建立数据库、缓冲池、表空间、表案例 77 1.34. 建立别名 78 1.35. 建立视图 78 1.36. 建立唯一性索引 78 1.37. 查看表的索引 79 1.38. 查看表 79 1.39. 建立触发器 79 1.40. 查看存储过程 79 1.41. view application 79 1.42. kill application 79 1.43. lock table(x) 79 1.44. lock table(s) 80 1.45. 列出所有的系统表 80 1.46. 列出系统数据库目录 80 1.47. 显示当前活动数据库 80 1.48. 查看命令选项 80 1.49. 表空间 80 1.50. 表空间容器 80 1.51. 如何知道SEQUENCE的状况 81 1.52. 如何知道SCHEMA的状况 81 1.53. 如何知道INDEX的状况 81 1.54. 查看装载数据库的instance 81 1.55. 创建数据库的instance 81 1.56. 创建数据库的catalog 81 1.57. 如何在命令行下执行DB2脚本(script) 82 1.58. 怎么样获取表结构以及索引的信息 82 1.59. 如果怀疑应用程序有死锁现象,如何确认是否死锁,并判断是哪些程序引起的死锁? 84 1.60. 数据库创建以后相关的目录和文件都有哪一些? 85 1.61. 自增列(IDENTITY) 86 1.62. 修改表结构的注意事项(原) 86 1.63. 可使用VALUES 来代替多个[not] in的条件语句 87 1.64. 计算数据库缓冲池的命中率公式 87 1.65. 查看表空间状态 88 1.66. UPDATE的N种用法 88 Examples 88 1.67. 查看表状态的快照命令 90 1.68. RUNSTATS的使用案例 91 1.69. Bufferpool设置过大导致数据库无法启动的解决方案 98 1.70. 查看DB2是否存在僵尸进程 98 1.71. 监控执行成本最高的SQL语句 99 1.72. 监控运行最长的SQL语句 99 1.73. 给表增加generated al

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧