急求一条MSSQL2005查询锁语句:查询出当前数据库中所有引成锁的原SQL语句 万分感谢 急

时间:2021-10-31 13:54:53
我的数据库表经常死锁了,
现在出现我只能停止数据库后再启动
但这样不是办法

有没有办法,当出现锁或者死锁的时候,
通过一条SQL语句去查询出当前数据库的所有锁和所有引起这个锁的SQL语句

这样我看到这条SQL语句的时候也好判断是在哪里出错的,好去改自己的程序

万分感谢

8 个解决方案

#1


启用1022,3064跟踪标记,有死锁发生时,自动记录到SQL日志中,以利分析.

#3


--就是会话456阻塞了123
select spid,   --会话id,比如:123
       
       blocked --是哪个会话阻塞了上面的会话,比如:456
from sys.sysprocesses 
where blocked <> 0


而且出现死锁的时候,会出现两条数据:
spid  blocked
123   456
456   123


其实就表示,123和456相互阻塞,也就是死锁

#4


我主要是要知道,出现锁和死锁的是哪些SQL语句
谢谢

#5


--查出OjbId大于0的是哪些ID
exec sp_lock


--再查询出对应OjbId
select * from sysobjects where id=OjbId



产生这种错误的原因大有可能是只有begin tran ,执行中因为错误后直接返回,没有执行commit tran或rollback tran

所以应该在begin tran前加上SET XACT_ABORT ON 

#6


这个最好是通过sql profiler,能跟踪详细的死锁的信息,不一定要跟踪所有锁的信息,因为锁的信息那是海量的信息,搞不好把你的服务器搞歇菜了哈 :

急求一条MSSQL2005查询锁语句:查询出当前数据库中所有引成锁的原SQL语句 万分感谢 急

#7


补充一下上面的图,打开SQL Profile,选择显示所有事件,在Locks中选择的跟踪事件为:

Locks:Deadlock graph 会显示死锁图,很容易理解
       Deadlock 报告死锁的信息
       Deadlock Chain 

#8


另外,也可以尝试:




--就是会话456阻塞了123
select t.spid,   --会话id,比如:123
       
       t.blocked, --是哪个会话阻塞了上面的会话,比如:456
       
       
       s.text     --会话所对应的sql语句
from sys.sysprocesses t
cross apply sys.dm_exec_sql_text(t.sql_handle)s
where blocked <> 0

#1


启用1022,3064跟踪标记,有死锁发生时,自动记录到SQL日志中,以利分析.

#2


#3


--就是会话456阻塞了123
select spid,   --会话id,比如:123
       
       blocked --是哪个会话阻塞了上面的会话,比如:456
from sys.sysprocesses 
where blocked <> 0


而且出现死锁的时候,会出现两条数据:
spid  blocked
123   456
456   123


其实就表示,123和456相互阻塞,也就是死锁

#4


我主要是要知道,出现锁和死锁的是哪些SQL语句
谢谢

#5


--查出OjbId大于0的是哪些ID
exec sp_lock


--再查询出对应OjbId
select * from sysobjects where id=OjbId



产生这种错误的原因大有可能是只有begin tran ,执行中因为错误后直接返回,没有执行commit tran或rollback tran

所以应该在begin tran前加上SET XACT_ABORT ON 

#6


这个最好是通过sql profiler,能跟踪详细的死锁的信息,不一定要跟踪所有锁的信息,因为锁的信息那是海量的信息,搞不好把你的服务器搞歇菜了哈 :

急求一条MSSQL2005查询锁语句:查询出当前数据库中所有引成锁的原SQL语句 万分感谢 急

#7


补充一下上面的图,打开SQL Profile,选择显示所有事件,在Locks中选择的跟踪事件为:

Locks:Deadlock graph 会显示死锁图,很容易理解
       Deadlock 报告死锁的信息
       Deadlock Chain 

#8


另外,也可以尝试:




--就是会话456阻塞了123
select t.spid,   --会话id,比如:123
       
       t.blocked, --是哪个会话阻塞了上面的会话,比如:456
       
       
       s.text     --会话所对应的sql语句
from sys.sysprocesses t
cross apply sys.dm_exec_sql_text(t.sql_handle)s
where blocked <> 0