关于TABLE的死锁问题,你敢来看吗 50chenjunsheep]

发布时间:2017-6-28 15:01:43 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"关于TABLE的死锁问题,你敢来看吗 50chenjunsheep]",主要涉及到关于TABLE的死锁问题,你敢来看吗 50chenjunsheep]方面的内容,对于关于TABLE的死锁问题,你敢来看吗 50chenjunsheep]感兴趣的同学可以参考一下。

执行步骤是这样的:  ①执行SQL语句让线程死锁(死锁表David01 David02,见附文)  ②强制KILL掉该死锁线程  ③再次访问表David01,David02(用SELECT语句访问表) 问题:执行到③的SELECT语句后,系统无法进行下去,用户一直处于等待状态...寒 附(让线程死锁的代码):  begin tran  update  David01  set A='aa'  where B='b2'  waitfor delay '00:00:5'  update  David02  set D='d5'  where E='e1'     --In the second connection  begin tran  update  David02  set D='d5'  where E='e1'  waitfor delay '00:00:3'  update  David01  set A='aa'  where B='b2'  为什么强制终止线程后,该表不能再次被访问呢? 还是说虽然死锁线程被终止掉了,但表自身的锁还没被解掉呢? 大虾们...HELP! 第二次发帖,大家多照顾照顾へへ

补充一下测试数据的SCRIPT create table  David01(  A varchar(2)  ,B varchar(2)  ,C varchar(2))     --insert data  insert into  David01  select 'a1','b1','c1'  union all select 'a2','b2','c2'  union all select 'a3','b3','c3'     --create table David02  create table  David02  (D varchar(2)  ,E varchar(2))     ----insert data  insert into  David02  select 'd1','e1'  union all select 'd2','e2' 

新技术前沿 牛啊

我试了一下,第一次出现这个: 消息 233,级别 20,状态 0,第 0 行 在向服务器发送请求时发生传输级错误。 (provider: 共享内存提供程序, error: 0 - 管道的另一端上无任何进程。)

这贴快沉了,顶起来!

你第2步怎么搞的?能不能看看你的代码啊

引用 5 楼 zhuyx808 的回复:你第2步怎么搞的?能不能看看你的代码啊 declare @sp nvarchar(100),@sql nvarchar(1000) set @sp = (Select spid from master..sysprocesses where blocked > 0) set @sql = 'kill [email protected] exec(@sql) 上面这段代码我是放到SQL服务的JOB里面定时执行的,也就是步骤2的执行代码,大家可以看看

楼主想说什么还是想问什么?

据说站在火星上看地球,唯一能看得见的就是楼主的小JJ

我是想问,当执行到第③步的时候,为什么一个简单的SELECT查询都会让用户一直处于等待状态...

引用 6 楼 chenjunsheep 的回复:引用 5 楼 zhuyx808 的回复: 你第2步怎么搞的?能不能看看你的代码啊 SQL [email protected](100),@sqlnvarchar(1000)[email protected]=(Selectspidfrommaster..sysprocesseswhereblocked>0)[email protected][email protected](@sql) 上面这段代码我是放到SQL服务的JOB里面定时执行的,也就是步骤2的执行代码,大家可以看看 这个不管用,你那两个事务,是一种死锁,不是堵塞,所以你用 Select spid from master..sysprocesses where blocked > 0 无法查找那两个进程,所以kill不掉的。 你用sp_lock查看那两个进程,然后去kill掉,就可以查询这两个表了。

引用 9 楼 chenjunsheep 的回复:我是想问,当执行到第③步的时候,为什么一个简单的SELECT查询都会让用户一直处于等待状态... 很简单啊,你的第一个Transction 并没有提交. 没有被你KILL掉的那SPID还握有独占锁. begin tran  update  David01  set A='aa'  where B='b2'  waitfor delay '00:00:5'  update  David02  set D='d5'  where E='e1'     --In the second connection  begin tran  update  David02  set D='d5'  where E='e1'  waitfor delay '00:00:3'  update  David01  set A='aa'  where B='b2' 

因为你两段代码都只有begin tran而没有commit或rollback 所以被kill后再执行时,仍要等待另一事务的结束。

进程如果kill掉,sql server 会自动rollback 的。就不会管你commit 和 rollback 了。 楼主的问题原因主要是它没有kill掉进程。

引用 6 楼 chenjunsheep 的回复:引用 5 楼 zhuyx808 的回复: 你第2步怎么搞的?能不能看看你的代码啊 SQL [email protected](100),@sqlnvarchar(1000)[email protected]=(Selectspidfrommaster..sysprocesseswhereblocked>0)[email protected][email protected](@sql) 上面这段代码我是放到SQL服务的JOB里面定时执行的,也就是步骤2的执行代码,大家可以看看 换成: create table #(spid varchar(20),dbid varchar(10),objid varchar(20),indid varchar(10),type varchar(20), resource varchar(20),mode varchar(10),status varchar(20)) insert into # exec sp_lock select distinct identity(int,1,1) as id, spid into #2 from # where mode in ('ix','x') and spid<>@@spid declare @i int set @i=1 declare @spid int while @i<=(select max(id) from #2) begin     select @spid=spid from #2 where [email protected]     exec('kill ' + @spid)     set @i= @i+1 end drop table #,#2

,,,,,

上一篇:如何获得一个SPID的IP 65znms200807201]
下一篇:ssis,用“传输 SQL Server 对象任务 ”COPY一个表,表名是动态的,如何配置?? 50Cool_Sword]

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。