Sql server SQL事务处于死锁状态

Sql server SQL事务处于死锁状态,sql-server,exception,stored-procedures,triggers,Sql Server,Exception,Stored Procedures,Triggers,有时,我在不太繁忙的SQL server上遇到这种异常: Transaction (Process ID 57) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction. Line number: 1 Error Number: 1205 Procedure: Server name: P01 Error Sou

有时,我在不太繁忙的SQL server上遇到这种异常:

Transaction (Process ID 57) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
Line number: 1
Error Number: 1205
Procedure: 
Server name: P01
Error Source: .Net SqlClient Data Provider
Error State: 47
我无法复制它。我试图同时运行来自不同客户机的几个查询,但没有显示出来。 当此类问题发生在过程或触发器内部时,处理此类问题的最佳方法是什么?我是说,如何重新运行事务


如何在从触发器调用的过程中发生异常时执行此操作,该过程是由某个过程(即:procedure01->insert->trigger->procedure02!)进行的插入调用的。

我建议您从两个角度来解决此问题

  • 死锁错误,以便可以重新运行SQL Server数据库引擎选择为死锁受害者的事务

  • 找出导致死锁事件的原因。 可以通过以下两种方法之一执行此操作:运行SQL Server探查器跟踪以捕获并记录死锁事件,或者启用一些将死锁事件的详细信息记录到SQL Server错误日志中的方法

  • 在绝大多数情况下,您可以确定死锁事件的原因,并通过数据库架构中的结构更改或对死锁事件所涉及/负责的代码进行逻辑更改来纠正这种情况

    进一步阅读请参阅:


    我希望我已经回答了您的问题,但如果我能以任何方式进一步帮助您,请务必告诉我。

    设置一个服务器端SQL跟踪,捕获死锁图事件,以便您可以使用SQL Profiler查看.trc文件。通过这种方式,您可以在适当的位置找到解决任何死锁的方法。我提供了下面的代码。您必须根据需要更改文件路径。最好将此脚本配置为在SQL server启动时执行

    仅供参考-很多不同的事情都可能导致死锁,其中之一就是缺少索引

    declare @rc int
    declare @TraceID int
    declare @maxfilesize bigint
    set @maxfilesize = 10 
    declare @dtName nvarchar(50)
    select @dtName=(N'I:\Trace_Logs\DeadLockTrace'+ convert(nvarchar(8),getdate(),112))
    
    
    -- Please replace the text InsertFileNameHere, with an appropriate
    -- filename prefixed by a path, e.g., c:\MyFolder\MyTrace. The .trc extension
    -- will be appended to the filename automatically. If you are writing from
    -- remote server to local drive, please use UNC path and make sure server has
    -- write access to your network share
    
    exec @rc = sp_trace_create @TraceID output, 2, @dtName, @maxfilesize, NULL ,365
    
    if (@rc != 0) goto error
    
    -- Client side File and Table cannot be scripted
    
    -- Set the events
    declare @on bit
    set @on = 1
    exec sp_trace_setevent @TraceID, 148, 11, @on
    exec sp_trace_setevent @TraceID, 148, 51, @on
    exec sp_trace_setevent @TraceID, 148, 4, @on
    exec sp_trace_setevent @TraceID, 148, 12, @on
    exec sp_trace_setevent @TraceID, 148, 14, @on
    exec sp_trace_setevent @TraceID, 148, 26, @on
    exec sp_trace_setevent @TraceID, 148, 60, @on
    exec sp_trace_setevent @TraceID, 148, 64, @on
    exec sp_trace_setevent @TraceID, 148, 1, @on
    exec sp_trace_setevent @TraceID, 148, 41, @on
    exec sp_trace_setevent @TraceID, 25, 7, @on
    exec sp_trace_setevent @TraceID, 25, 15, @on
    exec sp_trace_setevent @TraceID, 25, 55, @on
    exec sp_trace_setevent @TraceID, 25, 8, @on
    exec sp_trace_setevent @TraceID, 25, 32, @on
    exec sp_trace_setevent @TraceID, 25, 56, @on
    exec sp_trace_setevent @TraceID, 25, 64, @on
    exec sp_trace_setevent @TraceID, 25, 1, @on
    exec sp_trace_setevent @TraceID, 25, 9, @on
    exec sp_trace_setevent @TraceID, 25, 25, @on
    exec sp_trace_setevent @TraceID, 25, 41, @on
    exec sp_trace_setevent @TraceID, 25, 49, @on
    exec sp_trace_setevent @TraceID, 25, 57, @on
    exec sp_trace_setevent @TraceID, 25, 2, @on
    exec sp_trace_setevent @TraceID, 25, 10, @on
    exec sp_trace_setevent @TraceID, 25, 26, @on
    exec sp_trace_setevent @TraceID, 25, 58, @on
    exec sp_trace_setevent @TraceID, 25, 3, @on
    exec sp_trace_setevent @TraceID, 25, 11, @on
    exec sp_trace_setevent @TraceID, 25, 35, @on
    exec sp_trace_setevent @TraceID, 25, 51, @on
    exec sp_trace_setevent @TraceID, 25, 4, @on
    exec sp_trace_setevent @TraceID, 25, 12, @on
    exec sp_trace_setevent @TraceID, 25, 52, @on
    exec sp_trace_setevent @TraceID, 25, 60, @on
    exec sp_trace_setevent @TraceID, 25, 13, @on
    exec sp_trace_setevent @TraceID, 25, 6, @on
    exec sp_trace_setevent @TraceID, 25, 14, @on
    exec sp_trace_setevent @TraceID, 25, 22, @on
    exec sp_trace_setevent @TraceID, 59, 55, @on
    exec sp_trace_setevent @TraceID, 59, 32, @on
    exec sp_trace_setevent @TraceID, 59, 56, @on
    exec sp_trace_setevent @TraceID, 59, 64, @on
    exec sp_trace_setevent @TraceID, 59, 1, @on
    exec sp_trace_setevent @TraceID, 59, 21, @on
    exec sp_trace_setevent @TraceID, 59, 25, @on
    exec sp_trace_setevent @TraceID, 59, 41, @on
    exec sp_trace_setevent @TraceID, 59, 49, @on
    exec sp_trace_setevent @TraceID, 59, 57, @on
    exec sp_trace_setevent @TraceID, 59, 2, @on
    exec sp_trace_setevent @TraceID, 59, 14, @on
    exec sp_trace_setevent @TraceID, 59, 22, @on
    exec sp_trace_setevent @TraceID, 59, 26, @on
    exec sp_trace_setevent @TraceID, 59, 58, @on
    exec sp_trace_setevent @TraceID, 59, 3, @on
    exec sp_trace_setevent @TraceID, 59, 35, @on
    exec sp_trace_setevent @TraceID, 59, 51, @on
    exec sp_trace_setevent @TraceID, 59, 4, @on
    exec sp_trace_setevent @TraceID, 59, 12, @on
    exec sp_trace_setevent @TraceID, 59, 52, @on
    exec sp_trace_setevent @TraceID, 59, 60, @on
    
    -- Set the Filters
    declare @intfilter int
    declare @bigintfilter bigint
    
    -- Set the trace status to start
    exec sp_trace_setstatus @TraceID, 1
    
    -- display trace id for future references
    select TraceID=@TraceID
    goto finish
    
    error: 
    select ErrorCode=@rc
    
    finish: 
    go
    

    我使用ReadCommitted隔离级别解决了类似问题。

    我通过以下方式解决了此错误:

  • 重新启动SQL Server
  • 运行查询:

    使用[母版] 更改数据库名称\u数据库 设置多用户 立即回滚


  • 祝你好运

    在我的例子中,是缺少索引导致了死锁。我如何使用UNC路径?是什么导致了死锁事件?不降低性能如果有任何关于通常导致错误的原因的提示,这个答案将更有帮助。它在我的申请代码中吗?SQL过程?MSSQL中的Bug?