㈠ MSsqlSERVER中怎样查询引起死锁的sql语句
当死锁发生后,通过服务端的Trace就可以将死锁信息传到日志。在SQL Server 2000时代,只能通过Trace flag 1204来开启,由于Trace flag 1204并不能提供XML死锁图,在SQL Server 2005以及之后的版本被Trace flag 1222所取代。
为了在服务端针对所有的Session开启Trace flag 1222。可以通过如代码所示。
DBCC TRACEON(1222,-1)
另一种方法是开启Profiler来捕捉,Profiler捕捉到的图示死锁信息内容就更直观了,
㈡ sqlserver怎么用sql查看具体那个表被锁住了
查看被锁表:
select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName
from sys.dm_tran_locks where resource_type='OBJECT'
--spid 锁表进程
--tableName 被锁表名
解锁:
declare @spid int
Set @spid = 57 --锁表进程
declare @sql varchar(1000)
set @sql='kill '+cast(@spid as varchar)
exec(@sql)
--查询出死锁的SPID
select blocked
from (select * from sysprocesses where blocked>0 ) a
where not exists(select * from (select * from sysprocesses where blocked>0 ) b
where a.blocked=spid)
--输出引起死锁的操作
DBCC INPUTBUFFER (@spid)
--查询当前进程数
select count(-1) from sysprocesses
where dbid in (select dbid from sysdatabases where name like '%telcount%');
㈢ 如何查看SQL Server 2008的死锁
为了查看死锁信息,数据库引擎提供了监视工具,分别为两个跟踪标志以及
SQL
Server
Profiler中的死锁图形事件。
跟踪标志
1204
和跟踪标志
1222
发生死锁时,跟踪标志
1204
和跟踪标志
1222
会返回在
SQL
Server
错误日志中捕获的信息。跟踪标志
1204
会报告由死锁所涉及的每个节点设置格式的死锁信息。跟踪标志
1222
会设置死锁信息的格式,顺序为先按进程,然后按资源。可以同时启用这两个跟踪标志,以获取同一个死锁事件的两种表示形式。
SQL
Server
Profiler
中的
TraceEvent
Class:
LocksEvent
Name:
Deadlock
Graph
提供
一个XML
图表.,你可以从中看出发生了什么。
㈣ SQLServer死锁的解除方法
SQL Server死锁使我们经常遇到的问题 下面就为您介绍如何查询SQL Server死锁 希望对您学习SQL Server死锁方面能有所帮助
SQL Server死锁的查询方法
exec master dbo p_lockinfo 显示死锁的进程 不显示正常的进程
exec master dbo p_lockinfo 杀死死锁的进程 不显示正常的进程
SQL Server死锁的解除方法
Create proc p_lockinfo
@kill_lock_spid bit= 是否杀掉死锁的进程 杀掉 仅显示
@show_spid_if_nolock bit= 如果没有死锁的进程 是否显示正常进程信息 显示 不显示
as
declare @count int @s nvarchar( ) @i int
select id=identity(int ) 标志
进程ID=spid 线程ID=kpid 块进程ID=blocked 数据库ID=dbid
数据库名=db_name(dbid) 用户ID=uid 用户名=loginame 累计CPU时间=cpu
登陆时间=login_time 打开事务数=open_tran 进程状态=status
工作站名=hostname 应用程序名=program_name 工作站进程ID=hostprocess
域名=nt_domain 网卡地址=net_address
into #t from(
select 标志= 死锁的进程
spid kpid a blocked dbid uid loginame cpu login_time open_tran
status hostname program_name hostprocess nt_domain net_address
s =a spid s =
from mastersysprocesses a join (
select blocked from mastersysprocesses group by blocked
)b on a spid=b blocked where a blocked=
union all
select |_牺牲品_>
spid kpid blocked dbid uid loginame cpu login_time open_tran
status hostname program_name hostprocess nt_domain net_address
s =blocked s =
from mastersysprocesses a where blocked<>
)a order by s s
select @count=@@rowcount @i=
if @count= and @show_spid_if_nolock=
begin
insert #t
select 标志= 正常的进程
spid kpid blocked dbid db_name(dbid) uid loginame cpu login_time
open_tran status hostname program_name hostprocess nt_domain net_address
from mastersysprocesses
set @count=@@rowcount
end
if @count>
begin
create table #t (id int identity( ) a nvarchar( ) b Int EventInfo nvarchar( ))
if @kill_lock_spid=
begin
declare @spid varchar( ) @标志 varchar( )
while @i<=@count
begin
select @spid=进程ID @标志=标志 from #t whereid=@i
insert #t exec( dbcc inputbuffer( +@spid+ ) )
if @标志= 死锁的进程 exec( kill +@spid)
set @i=@i+
end
end
else
while @i<=@count
begin
select @s= dbcc inputbuffer( +cast(进程ID as varchar)+ ) from #t whereid=@i
insert #t exec(@s)
set @i=@i+
end
select a * 进程的SQL语句=b EventInfo
from #t a join #t b on a id=b id
lishixin/Article/program/SQLServer/201311/22183
㈤ sql server中怎样查询引起死锁的sql语句
DECLARE@spidINT
DECLARE@blkINT
DECLARE@countINT
DECLARE@indexINT
DECLARE@lockTINYINT
SET@lock=0
CREATETABLE#temp_who_lock
(
idINTIDENTITY(1,1),
spidINT,
blkINT
)
--if@@error<>0return@@error
INSERTINTO#temp_who_lock
(spid,
blk)
SELECT0,
blocked
FROM(SELECT*
FROMmaster..sysprocesses
WHEREblocked>0)a
WHERENOTEXISTS(SELECT*
FROMmaster..sysprocesses
WHEREa.blocked=spid
ANDblocked>0)
UNION
SELECTspid,
blocked
FROMmaster..sysprocesses
WHEREblocked>0
--if@@error<>0return@@error
SELECT@count=Count(*),
@index=1
FROM#temp_who_lock
--select@count,@index
--if@@error<>0return@@error
IF@count=0
BEGIN
SELECT'没有阻塞和死锁信息'
--return0
END
WHILE@index<=@count
BEGIN
IFEXISTS(SELECT1
FROM#temp_who_locka
WHEREid>@index
ANDEXISTS(SELECT1
FROM#temp_who_lock
WHEREid<=@index
ANDa.blk=spid))
BEGIN
SET@lock=1
SELECT@spid=spid,
@blk=blk
FROM#temp_who_lock
WHEREid=@index
SELECT'引起数据库死锁的是:'+Cast(@spidASVARCHAR(10))+'进程号,其执行的SQL语法如下';
SELECT@spid,
@blkDBCCinputbuffer(@spid)
DBCCinputbuffer(@blk)
END
SET@index=@index+1
END
IF@lock=0
BEGIN
SET@index=1
WHILE@index<=@count
BEGIN
SELECT@spid=spid,
@blk=blk
FROM#temp_who_lock
WHEREid=@index
IF@spid=0
SELECT'引起阻塞的是:'+Cast(@blkASVARCHAR(10))+'进程号,其执行的SQL语法如下'
ELSE
SELECT'进程号SPID:'+Cast(@spidASVARCHAR(10))+'被'+'进程号SPID:'+Cast(@blkASVARCHAR(10))+'阻塞,其当前进程执行的SQL语法如下'
PRINT(LTRIM(@spid)+''+LTRIM(@blk));
if(@spid<>0)
BEGIN
DBCCinputbuffer(@spid)--
END
DBCCinputbuffer(@blk)--引起阻塞语句
SET@index=@index+1
END
END
DROPTABLE#temp_who_lock
--return0
--KILL54
㈥ sqlServer查看死锁及解锁
--查看死锁
select spid, blocked, loginame, last_batch, status, cmd, hostname, program_name
from sysprocesses
where spid in
( select blocked from sysprocesses where blocked <> 0 ) or (blocked <>0)
--解锁
kill 进程号(spid)