如何消除此游标(导致死锁)

时间:2013-05-17 10:47:07

标签: sql-server-2008 cursor deadlock

我们有一个存储过程。部分原因是在select语句上执行游标,该语​​句涉及6个具有内部联接的不同表。

在游标体中,我们使用游标中的参数执行3个其他存储过程。

在这种情况下有没有办法摆脱光标?

全部谢谢!

  DECLARE myCursor CURSOR FOR
              SELECT x,y,z
              FROM   a
                     INNER JOIN .....
                     INNER JOIN .....
                     INNER JOIN .....
                     INNER JOIN .....
                     INNER JOIN .....

            OPEN myCursor

            FETCH NEXT ...

            WHILE @@FETCH_STATUS = 0
              BEGIN

                    EXECUTE xy @cursor_variable

                    EXECUTE yz @cursor_variable

                    EXECUTE abc @cursor_variable

                  FETCH NEXT FROM myCursor INTO ...
              END

            CLOSE myCursor

            DEALLOCATE myCursor
        END

3 个答案:

答案 0 :(得分:1)

您可能想要做的是将连接选择到临时表中,然后在光标中使用它。至少那时基表是免费的。

答案 1 :(得分:1)

尝试一个不会保持锁定的静态游标。

答案 2 :(得分:0)

我在一些有助于防止死锁的数据上使用的游标是:

declare cursor YOURCURSORNAME cursor local static read_only forward_only for  

但是这对于防止死锁并不总是有效的,因为在查询表时仍然可以锁定表,特别是当使用同时游标查询相同的表时。

@JeffB建议将数据复制到临时表,这将有所帮助。

或者,您可以执行脏读,如果您的方案允许您通过在查询的每个表上使用(nolock),或在查询开头设置以下标志来执行此操作。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;