博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL Server 表,记录 死锁解决办法
阅读量:7069 次
发布时间:2019-06-28

本文共 3240 字,大约阅读时间需要 10 分钟。

我自己的数据库表记录死锁后的 根据以下资料的 解决方案:

 1. 先根据以下语句 查询 哪些表被 死锁,及 死锁的  spid

SELECT request_session_id spid,OBJECT_NAME(resource_associated_entity_id)tableName FROM sys.dm_tran_locks WHERE resource_type='OBJECT '

2. 再根据以上 语句查询出来的 spid 通过以下存储过程 查询是哪台机客户机 在操作,造成的死锁

exec sp_who2 'xxx'  -- xxx 是 spid 替换进去就好,就可以看到是哪台机造成的死锁.

3. 最后通过 以下语句来清退进程,(当然我这次是因为查到是哪机子在操作,所以让那台机子的客户机退出客户端 就可以了.)

KILL xxx   -- xxx 是spid 执行就好

 

 

 

 

 

方法一:

摘自:

前些天写一个存储过程,存储过程中使用了事务,后来我把一些代码注释掉来进行调试找错,突然发现一张表被锁住了,原来是创建事务的代码忘记注释掉。本文表锁住了的解决方法。

-
其实不光是上面描述的情况会锁住表,还有很多种场景会使表放生死锁,解锁其实很简单,下面用一个示例来讲解:

1 首先创建一个测试用的表:

复制代码 代码如下:
CREATE TABLE Test
(
TID INT IDENTITY(1,1)
)

2 执行下面的SQL语句将此表锁住:

复制代码 代码如下:
SELECT * FROM Test WITH (TABLOCKX)

3 通过下面的语句可以查看当前库中有哪些表是发生死锁的:

复制代码 代码如下:
SELECT request_session_id spid,OBJECT_NAME(resource_associated_entity_id)tableName
FROM sys.dm_tran_locks
WHERE resource_type='OBJECT '

4 上面语句执行结果如下:

 

spid :被锁进程ID。
tableName:发生死锁的表名。

5 只需要使用kill关键字来杀掉被锁的进程ID就可以对表进行解锁:

KILL 52

详细出处参考:

 

方法二:

摘自:

SQL Server死锁使我们经常遇到的问题,下面就为您介绍如何查询死锁,希望对您学习SQL Server死锁方面能有所帮助。

SQL Server死锁的查询方法:

 

exec master.dbo.p_lockinfo 0,0 ---显示死锁的进程,不显示正常的进程   exec master.dbo.p_lockinfo 1,0 ---杀死死锁的进程,不显示正常的进程

 

SQL Server死锁的解除方法:

 

Create proc p_lockinfo  @kill_lock_spid bit=1, --是否杀掉死锁的进程,1 杀掉, 0 仅显示  @show_spid_if_nolock bit=1 --如果没有死锁的进程,是否显示正常进程信息,1 显示,0 不显示  as   declare @count int,@s nvarchar(1000),@i int  select id=identity(int,1,1),标志,  进程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,  s1=a.spid,s2=0 from master..sysprocesses a join (  select blocked from master..sysprocesses group by blocked  )b on a.spid=b.blocked where a.blocked=0 union all  select '|_牺牲品_>',  spid,kpid,blocked,dbid,uid,loginame,cpu,login_time,open_tran,  status,hostname,program_name,hostprocess,nt_domain,net_address,  s1=blocked,s2=1 from master..sysprocesses a where blocked<>0  )a order by s1,s2   select @count=@@rowcount,@i=1  if @count=0 and @show_spid_if_nolock=1 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 master..sysprocesses  set @count=@@rowcount  end   if @count>0  begin  create table #t1(id int identity(1,1),a nvarchar(30),b Int,EventInfo nvarchar(255))  if @kill_lock_spid=1 begin  declare @spid varchar(10),@标志 varchar(10)  while @i<=@count  begin     select @spid=进程ID,@标志=标志 from #t whereid=@i     insert #t1 exec('dbcc inputbuffer('+@spid+')')     if @标志='死锁的进程' exec('kill'+@spid)     set @i=@i+1  end  end  else  while @i<=@count  begin     select @s='dbcc inputbuffer('+cast(进程ID as varchar)+')' from #t whereid=@i     insert #t1 exec(@s)     set @i=@i+1  end  select a.*,进程的SQL语句=b.EventInfo  from #t a join #t1 b on a.id=b.id  end

 

 

 

方法三:

1、select * from sys.dm_tran_locks或sp_LOCK 查看request_node 字段中为'X'(排他锁)或'IX'(意向排他锁) 2、用sp_who2 + pid(进程ID) 查看进程的详细信息 3、用dbcc inputbuffer(pid) 查看一起死锁的语句内容 以上方法应该能解决你的问题。

 

转载地址:http://ihqll.baihongyu.com/

你可能感兴趣的文章
Kali 2017.1设置滚动更新源
查看>>
桶排序
查看>>
字符串(二):string
查看>>
package.json与package-lock.json的区别
查看>>
[精品]CAD批量处理工具
查看>>
关于main函数的定义
查看>>
链接<a href="javascript:void(0)" />
查看>>
会议记录
查看>>
jquery php ajax 表单验证
查看>>
vue复选框获取值的补充
查看>>
关于在获取数据后对数据用forEach进行处理的认知
查看>>
n皇后问题,状态压缩
查看>>
SVN的Not authorized to open root of edit operation解决办法
查看>>
『2019/3/19 USACO测试 反思与总结』
查看>>
运用Composite模式构造JSON
查看>>
ant 中用到的各种变量的方式
查看>>
HTML基本标签
查看>>
线性相关性度量
查看>>
git遇到的问题
查看>>
TCP通信服务端及客户端代码
查看>>