> 唯美句子 > sqlserver中怎样查询引起死锁

sqlserver中怎样查询引起死锁

sql server中怎样查询引起死锁的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)

怎样查询引起死锁的sql语句

elect 0 ,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)

union select spid,blocked from sysprocesses where blocked>0

OPEN s_cur

FETCH NEXT FROM s_cur INTO @spid,@bl

WHILE @@FETCH_STATUS = 0

begin

if @spid =0

select ' 引起数据库死锁的是: '+ CAST(@bl AS VARCHAR(10)) + ' 进程号, 其执行的SQL 语法如下'

else

select ' 进程号SPID :'+ CAST(@spid AS VARCHAR(10))+ ' 被' + ' 进程号SPID :'+ CAST(@bl AS VARCHAR(10)) +' 阻塞, 其当前进程执行的SQL 语法如下'

DBCC INPUTBUFFER (@bl )

如何查看SQL死锁

查询出来:

select

request_session_id spid,

OBJECT_NAME(resource_associated_entity_id) tableName

from

sys.dm_tran_locks

where

resource_type='OBJECT

杀死死锁进程:

kill spid

怎样查询引起死锁的sql语句

select

request_session_id spid,

OBJECT_NAME(resource_associated_entity_id) tableName

from

sys.dm_tran_locks

where

resource_type='OBJECT'

这个是sql server的

怎么把引起sql数据库死锁的语句找出来

死锁一下子就被ORACLE检测出来并自动解决了。

既然你能够找到SESSION并KILL它,在V$SESSION中有个SQL_ID可以告诉你。

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捕捉到的图示死锁信息内容就更直观了,

sql server中怎样查询引起死锁的sql语句

DECLARE @spid INT

DECLARE @blk INT

DECLARE @count INT

DECLARE @index INT

DECLARE @lock TINYINT

SET @lock=0

CREATE TABLE #temp_who_lock

(

id   INT IDENTITY(1, 1),

spid INT,

blk  INT

)

--if @@error0 return @@error

INSERT INTO #temp_who_lock

(spid,

blk)

SELECT 0,

blocked

FROM   (SELECT *

FROM   master..sysprocesses

WHERE  blocked > 0)a

WHERE  NOT EXISTS(SELECT *

FROM   master..sysprocesses

WHERE  a.blocked = spid

AND blocked > 0)

UNION

SELECT spid,

blocked

FROM   master..sysprocesses

WHERE  blocked > 0

--if @@error0 return @@error

SELECT @count = Count(*),

@index = 1

FROM   #temp_who_lock

--select @count,@index

--if @@error0 return @@error

IF @count = 0

BEGIN

SELECT '没有阻塞和死锁信息'

--return 0

END

WHILE @index <= @count

BEGIN

IF EXISTS(SELECT 1

FROM   #temp_who_lock a

WHERE  id > @index

AND EXISTS(SELECT 1

FROM   #temp_who_lock

WHERE  id <= @index

AND a.blk = spid))

BEGIN

SET @lock=1

SELECT @spid = spid,

@blk = blk

FROM   #temp_who_lock

WHERE  id = @index

SELECT  '引起数据库死锁的是: ' + Cast(@spid AS VARCHAR(10)) + '进程号,其执行的SQL语法如下' ;

SELECT @spid,

@blk

DBCC inputbuffer(@spid)

DBCC inputbuffer(@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

WHERE  id = @index

IF @spid = 0

SELECT '引起阻塞的是:' + Cast(@blk AS VARCHAR(10)) + '进程号,其执行的SQL语法如下'

ELSE

SELECT '进程号SPID:' + Cast(@spid AS VARCHAR(10)) + '被' + '进程号SPID:' + Cast(@blk AS VARCHAR(10)) + '阻塞,其当前进程执行的SQL语法如下'

PRINT ( LTRIM(@spid) + ''+ LTRIM(@blk));

if(@spid  0)

BEGIN

DBCC inputbuffer(@spid)   --

END

DBCC inputbuffer(@blk)   --引起阻塞语句

SET @index=@index + 1

END

END

DROP TABLE #temp_who_lock

--return 0

--KILL 54

如何查看死锁的”SQL语句“或”存储过程“

假如发生了死锁,我们怎么去检测具体发生死锁的是哪条SQL语句或存储过程?此时我们可以使用以下存储过程来检测,就可以查出引起死锁的进程和SQL语句。

Sql代码

usemaster

go

create proceduresp_who_lock

as

begin

declare @spid int,@blint,

@intTransactionCountOnEntryint,

@intRowcountint,

@intCountPropertiesint,

@intCounter int

create table #tmp_lock_who(

id intidentity(1,1),

spidsmallint,

blsmallint)

IF @@ERROR0 RETURN@@ERROR

insert into#tmp_lock_who(spid,bl) select 0 ,blocked

from (select * fromsysprocesses where blocked>0 ) a

where not exists(select *from

(select * from sysprocesseswhere blocked>0 ) b

wherea.blocked=spid)

union select spid,blockedfrom sysprocesses where blocked>0

IF @@ERROR0 RETURN@@ERROR

-- 找到临时表的记录数

select @intCountProperties= Count(*),@intCounter = 1

from#tmp_lock_who

IF @@ERROR0 RETURN@@ERROR

if@intCountProperties=0

select '现在没有阻塞和死锁信息' as message

-- 循环开始

while @intCounter <=@intCountProperties

begin

-- 取第一条记录

select @spid = spid,@bl =bl

from #tmp_lock_who where Id= @intCounter

begin

if @spid=0

select '引起数据库死锁的是: '+ CAST(@bl ASVARCHAR(10))

+ '进程号,其执行的SQL语法如下'

else

select '进程号SPID:'+ CAST(@spid AS VARCHAR(10))

+ '被进程号SPID:'+ CAST(@bl ASVARCHAR(10))

+ '阻塞,其当前进程执行的SQL语法如下'DBCC INPUTBUFFER

use master

go

create proceduresp_who_lock

as

begin

declare @spid int,@bl int,

@intTransactionCountOnEntryint,

@intRowcount int,

@intCountProperties int,

@intCounter int

create table #tmp_lock_who(

id int identity(1,1),

spid smallint,

bl smallint)

IF @@ERROR0 RETURN@@ERROR

insert into#tmp_lock_who(spid,bl) select 0 ,blocked

from (select * fromsysprocesses where blocked>0 ) a

where not exists(select *from

(select * from sysprocesseswhere blocked>0 ) b

where a.blocked=spid)

union select spid,blockedfrom sysprocesses where blocked>0

IF @@ERROR0 RETURN@@ERROR

-- 找到临时表的记录数

select @intCountProperties= Count(*),@intCounter = 1

from #tmp_lock_who

IF @@ERROR0 RETURN@@ERROR

if @intCountProperties=0

select '现在没有阻塞和死锁信息' as message

-- 循环开始

while @intCounter <=@intCountProperties

begin

-- 取第一条记录

select @spid = spid,@bl =bl

from #tmp_lock_who where Id= @intCounter

begin

if @spid =0

select '引起数据库死锁的是: '+ CAST(@bl AS VARCHAR(10))

+ '进程号,其执行的SQL语法如下'

else

select '进程号SPID:'+ CAST(@spid AS VARCHAR(10))

+ '被进程号SPID:'+ CAST(@bl AS VARCHAR(10))

+ '阻塞,其当前进程执行的SQL语法如下'DBCC INPUTBUFFER

与锁定有关的两个问题--死锁和阻塞

sql server中怎样查询引起死锁的sql语句

elect0,blockedfrom(select*fromsysprocesseswhereblocked>0)awherenotexists(select*from(select*fromsysprocesseswhereblocked>0)bwherea.blocked=spid)unionselectspid,blockedfromsysprocesseswhereblocked>0OPENs_curFETCHNEXTFROMs_curINTO@spid,@blWHILE@@FETCH_STATUS=0beginif@spid=0select'引起数据库死锁的是:'+CAST(@blASVARCHAR(10))+'进程号,其执行的SQL语法如下'elseselect'进程号SPID:'+CAST(@spidASVARCHAR(10))+'被'+'进程号SPID:'+CAST(@blASVARCHAR(10))+'阻塞,其当前进程执行的SQL语法如下'DBCCINPUTBUFFER(@bl)

用sql语句,怎么解决mysql数据库死锁

对于MySQL来说,有三种锁的级别:页级、表级、行级

页级的典型代表引擎为BDB。

表级的典型代表引擎为MyISAM,MEMORY以及很久以前的ISAM。

行级的典型代表引擎为INNODB。

-我们实际应用中用的最多的就是行锁。

行级锁的优点如下:

1)、当很多连接分别进行不同的查询时减小LOCK状态。

2)、如果出现异常,可以减少数据的丢失。因为一次可以只回滚一行或者几行少量的数据。

行级锁的缺点如下:

1)、比页级锁和表级锁要占用更多的内存。

2)、进行查询时比页级锁和表级锁需要的I/O要多,所以我们经常把行级锁用在写操作而不是读操作。

3)、容易出现死锁。

对于写锁定如下:

1)、如果表没有加锁,那么对其加写锁定。

2)、否则,那么把请求放入写锁队列中。

对于读锁定如下:

1)、如果表没有加写锁,那么加一个读锁。

2)、否则,那么把请求放到读锁队列中。

当然我们可以分别用low_priority 以及high_priority在写和读操作上来改变这些行为。

如果想要在一个表上做大量的 INSERT 和 SELECT 操作,但是并行的插入却不可能时,可以将记录插入到临时表中,然后定期将临时表中的数据更新到实际的表里。可以用以下命令实现:

mysql> LOCK TABLES real_table WRITE, insert_table WRITE;

mysql> INSERT INTO real_table SELECT * FROM insert_table;

mysql> TRUNCATE TABLE insert_table;

mysql> UNLOCK TABLES;

InnoDB 使用行级锁,BDB 使用页级锁。对于 InnoDB 和 BDB 存储引擎来说,是可能产生死锁的。这是因为 InnoDB 会自动捕获行锁,BDB 会在执行 SQL 语句时捕获页锁的,而不是在事务的开始就这么做。

行级锁的优点有:

在很多线程请求不同记录时减少冲突锁。

事务回滚时减少改变数据。

使长时间对单独的一行记录加锁成为可能。

行级锁的缺点有:

比页级锁和表级锁消耗更多的内存。

当在大量表中使用时,比页级锁和表级锁更慢,因为他需要请求更多的所资源。

当需要频繁对大部分数据做 GROUP BY 操作或者需要频繁扫描整个表时,就明显的比其它锁更糟糕。

使用更高层的锁的话,就能更方便的支持各种不同的类型应用程序,因为这种锁的开销比行级锁小多了。

表级锁在下列几种情况下比页级锁和行级锁更优越:

很多操作都是读表。

在严格条件的索引上读取和更新,当更新或者删除可以用单独的索引来读取得到时:

UPDATE tbl_name SET column=value WHERE unique_key_col=key_value;

DELETE FROM tbl_name WHERE unique_key_col=key_value;

SELECT 和 INSERT 语句并发的执行,但是只有很少的 UPDATE 和 DELETE 语句。

很多的扫描表和对全表的 GROUP BY 操作,但是没有任何写表。

表级锁和行级锁或页级锁之间的不同之处还在于:

将同时有一个写和多个读的地方做版本(例如在MySQL中的并发插入)。也就是说,数据库/表支持根据开始访问数据时间点的不同支持各种不同的试图。其它名有:时间行程,写复制,或者是按需复制。

复制代码 代码如下:

//执行SQL语句 锁掉stat_num表

$sql = "LOCK TABLES 表名 WRITE"; //表的WRITE锁定,阻塞其他所有mysql查询进程

mysql_query($sql);

//执行更新或写入操作

$sql = "UPDATE stat_num SET `correct_num`=`correct_num`+1 WHERE stat_date='{$cur_date}'";

mysql_query($sql);

//当前请求的所有写操作做完后,执行解锁sql语句

$sql = "UNLOCK TABLES";

mysql_query($sql);

sqlserver中怎样查询引起死锁:等您坐沙发呢!

发表评论

您必须 [ 登录 ] 才能发表留言!