+ -
当前位置:首页 → 问答吧 → msSqlServer是如何判断死锁的

msSqlServer是如何判断死锁的

时间:2011-11-24

来源:互联网

当对数据库并发访问的时候,当两个会话同时等待访问由其他会话锁定的资源时,便会发生死锁。
当sql发现死锁的访问后,将选择其中一个会话作为死锁牺牲品来解决死锁.
这个是msSqlServer的基本功能,我想大多数人都有所了解,
我想问的是,msSqlServer自身是如何判断2个访问发生了死锁的啊,
我做了一个简单的存储过程,然后用并发去执行,超不过10次就提示,发生了死锁,我很不理解啊.
存储过程代码SQL code
ALTER PROCEDURE [dbo].[test]  
AS
BEGIN
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
insert dbo.temp(name) select top 1 id  from TransferInformation where RecordsState<>5
declare @id int
select  @id=name from temp  where id= @@IDENTITY
update TransferInformation set RecordsState=5 where Id=@id
 COMMIT TRANSACTION
END

大家都是调用者一个存储过程,先调用的会对temp表上锁,然后其他的访问等待,等上一个事务结束后,下一个在执行,并没死锁的可能啊.......

作者: xl2031   发布时间: 2011-11-24

因为你笨

作者: pcwmy   发布时间: 2011-11-24

请问这个存储过程哪里设计的不合适呢,请指教
引用 1 楼 pcwmy 的回复:
因为你笨

作者: xl2031   发布时间: 2011-11-24

oh my god 还没人回复..

作者: xl2031   发布时间: 2011-11-24

作者: roy_88   发布时间: 2011-11-24

SQL code
UPDATE TOP (1) TransferInformation 
set RecordsState=5 
where RecordsState<>5


就這麼回事

作者: roy_88   发布时间: 2011-11-24

SQL2000就樣用

SQL code
SET ROWCOUNT 1;
UPDATE  TransferInformation 
set RecordsState=5 
where RecordsState<>5;
SET ROWCOUNT 0;

作者: roy_88   发布时间: 2011-11-24

非常感谢,但是不起作用
引用 6 楼 roy_88 的回复:
SQL2000就樣用


SQL code
SET ROWCOUNT 1;
UPDATE TransferInformation
set RecordsState=5
where RecordsState<>5;
SET ROWCOUNT 0;

作者: xl2031   发布时间: 2011-11-24

稍微改一下,如下代码,你再并发执行也不会死锁了,嘿嘿..
SQL code

ALTER PROCEDURE [dbo].[test]  
AS
BEGIN
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
insert dbo.temp(name) 
select top 1 id  from TransferInformation(nolock) where RecordsState<>5
declare @id int
select  @id=name from temp(nolock) where id= @@IDENTITY
update TransferInformation set RecordsState=5 where Id=@id
COMMIT TRANSACTION
END

作者: ap0405140   发布时间: 2011-11-24