Sql server SQL Server存储过程死锁
我知道,SQL Server 2008R2中的定期作业调用此存储过程时,它总是会出现死锁: [Microsoft][ODBC SQL Server驱动程序][SQL Server]事务(进程ID XX)在与另一个进程的锁通信缓冲区资源上死锁,已被选为死锁受害者。重新运行事务 程序如下,我已经替换了变量名。它获取一个参数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 有什么建议吗?马克斯多普?视图
@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参数,并一次性处理与我的_游标中相同的所有记录。从锁定(和死锁)的角度来看,它更有利。而且应该快得多。我认为这在很大程度上取决于“其他程序”在做什么。