加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 电商 > 正文

在SQL Server 2005中解决死锁

发布时间:2018-11-12 13:34:39 所属栏目:电商 来源:站长网
导读:数据库操纵的死锁是不行停止的,本文并不规划接头死锁怎样发生,重点在于办理死锁,通过SQL Server 2005, 此刻好像有了一种新的办理步伐。 将下面的SQL语句放在两个差异的毗连内里,而且在5秒内同时执行,将会发存亡锁。 use Northwind begin tran insert

数据库操纵的死锁是不行停止的,本文并不规划接头死锁怎样发生,重点在于办理死锁,通过SQL Server 2005, 此刻好像有了一种新的办理步伐。

将下面的SQL语句放在两个差异的毗连内里,而且在5秒内同时执行,将会发存亡锁。


use Northwind

begin tran
    insert into Orders(CustomerId) values('ALFKI')
    waitfor delay '00:00:05'
    select * from Orders where CustomerId = 'ALFKI'
commit
print 'end tran'
SQL Server搪塞死锁的步伐是捐躯掉个中的一个,抛出非常,而且回滚事宜。在SQL Server 2000,语句一旦产生非常,T-SQL将不会继承运行,上面被捐躯的毗连中, print 'end tran'语句将不会被运行,以是我们很难在SQL Server 2000的T-SQL中对死锁举办进一步的处理赏罚。

此刻差异了,SQL Server 2005可以在T-SQL中对非常举办捕捉,这样就给我们提供了一条处理赏罚死锁的途径:

下面操作的try ... catch来办理死锁。


SET XACT_ABORT ON

declare @r int
set @r = 1
while @r <= 3
begin
    begin tran
    
    begin try       
        insert into Orders(CustomerId) values('ALFKI')
        waitfor delay '00:00:05'
        select * from Orders where CustomerId = 'ALFKI'
        
        commit
        break
    end try
        
    begin catch
        rollback
        waitfor delay '00:00:03'
        set @r = @r + 1
        continue
    end catch
end
办理要领虽然就是重试,但捕捉错误是条件。rollback后头的waitfor不行少,产生斗嘴后必要守候一段时刻,@retry数量可以调解以应付差异的要求。

可是此刻又面对一个新的题目: 错误被袒护了,一但题目产生而且高出3次,非常却不会被抛出。SQL Server 2005 有一个RaiseError语句,可以抛出非常,但却不能直接抛出原本的非常,以是必要从头界说产生的错误,此刻,办理方案酿成了这样:


declare @r int
set @r = 1
while @r <= 3
begin
    begin tran
    
    begin try       
        insert into Orders(CustomerId) values('ALFKI')
        waitfor delay '00:00:05'
        select * from Orders where CustomerId = 'ALFKI'
        
        commit
        break
    end try
        
    begin catch
        rollback
        waitfor delay '00:00:03'
        set @r = @r + 1
        continue
    end catch
end

if ERROR_NUMBER() <> 0
begin
    declare @ErrorMessage nvarchar(4000);
    declare @ErrorSeverity int;
    declare @ErrorState int;

    select 
        @ErrorMessage = ERROR_MESSAGE(),
        @ErrorSeverity = ERROR_SEVERITY(),
        @ErrorState = ERROR_STATE();

    raiserror (@ErrorMessage,
               @ErrorSeverity,
               @ErrorState
               );
end
我但愿未来SQL Server 2005可以或许直接抛出原有非常,好比提供一个无参数的RaiseError。

因此方案有点痴肥,但将死锁题目封装到T-SQL中有助于明晰职责,进步高层体系的清楚度。此刻,对付DataAccess的代码,或者再也不必要思量死锁题目了。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读