Sql server SQL Server存储过程死锁

Sql server SQL Server存储过程死锁,sql-server,stored-procedures,sql-server-2008-r2,Sql Server,Stored Procedures,Sql Server 2008 R2,我知道,SQL Server 2008R2中的定期作业调用此存储过程时,它总是会出现死锁: [Microsoft][ODBC SQL Server驱动程序][SQL Server]事务(进程ID XX)在与另一个进程的锁通信缓冲区资源上死锁,已被选为死锁受害者。重新运行事务 程序如下,我已经替换了变量名。它获取一个参数@Time,并将从表myTable和视图myView读取数据。myView上没有任何索引 它还将调用另一个过程来更新另一个表mysecondable 有什么建议吗?马克斯多普?视图

我知道,SQL Server 2008R2中的定期作业调用此存储过程时,它总是会出现死锁:

[Microsoft][ODBC SQL Server驱动程序][SQL Server]事务(进程ID XX)在与另一个进程的锁通信缓冲区资源上死锁,已被选为死锁受害者。重新运行事务

程序如下,我已经替换了变量名。它获取一个参数
@Time
,并将从表
myTable
和视图
myView
读取数据。
myView
上没有任何索引

它还将调用另一个过程来更新另一个表
mysecondable

有什么建议吗?马克斯多普?视图上的索引?或者问题出在光标上

谢谢

CREATE PROCEDURE MY_Schedule    
    @TIME datetime = NULL
AS
    DECLARE @localVar1 varchar(50)
    DECLARE @localVar2 varchar(50)
    DECLARE @localVar3 int
    DECLARE @localVar4 varchar(50)
    DECLARE @localVar10 varchar(50)   
    DECLARE @localVar11 varchar(50)   
    DECLARE @localVar12 varchar(50)   
    DECLARE @localVar13 int   
    DECLARE @flag INT   

    Select @flag = Value   
    From myTabe   
    Where condition1 = ‘xxxx’ and condition2 = ‘xxxx’ and condition3 = ‘xxxx’   

   DECLARE MY_CURSOR CURSOR LOCAL READ_ONLY FAST_FORWARD    
   FOR   
      SELECT 
          P1, P2, P3, P4, P5, P6, MAX(P7) AS C1, MAX(P8) AS S1,   
          MAX(P9), MAX(P10), MAX(P11), MAX(P12), MAX(P13), 
          MAX(P14), MAX(P15)   
      FROM myTabe   
      WHERE TimeStamp BETWEEN DATEADD(DD, -1, @TIME) AND @TIME   
      GROUP BY P2, P3, P4, P5, P6, P1   
      ORDER BY P5, P6   

   OPEN MY_CURSOR   

   FETCH NEXT FROM MY_CURSOR   
INTO @localVar1, @localVar2, @localVar3, @localVar4, @starttime, @stoptime,    @localVar5, @localVar6, @localVar7, @localVar8, @localVar9, @localVar10, @localVar11, @localVar12, @localVar13

   WHILE @@FETCH_STATUS = 0   
   BEGIN
      IF (@flag = 1 )   
      BEGIN  
          EXEC anotherPROCEDURE @localVar2, @localVar3, @localVar4,
                                @localVar1, @starttime, @stoptime, 
                                @localVar13, @localVar7, @localVar8,
                                @localVar9, @localVar10, @localVar11, 
                                @localVar12
      END   
      ELSE
      BEGIN
         EXEC anotherPROCEDURE @localVar2, @localVar3, @localVar4,  
                               @localVar1, @starttime, @stoptime, 
                               @localVar6, @localVar7, @localVar8, 
                               @localVar9, @localVar10, @localVar11, 
                               @localVar12
      END

      FETCH NEXT FROM MY_CURSOR
        INTO    @localVar1, @localVar2, @localVar3, @localVar4, @starttime, @stoptime, @localVar5, @localVar6, @localVar7, @localVar8, @localVar9,   @localVar10, @localVar11, @localVar12, @localVar13
END

CLOSE MY_CURSOR   
DEALLOCATE MY_CURSOR

细节太少,无法做出任何实际判断,但我会将逐行处理转移到基于集合的方法。我将重写过程,以获取@TIME参数,并一次性处理与我的_游标中相同的所有记录。从锁定(和死锁)的角度来看,它更有利。而且应该快得多。

我认为这在很大程度上取决于“其他程序”在做什么。