使用Python处理SQL Server死锁

时间:2013-06-03 17:19:56

标签: python sql-server python-2.7 try-catch database-deadlocks

处理

的最佳方法是什么
  

1205“死锁受害者”

从Python调用SQL Server时出现

错误?

当我运行多个Python脚本时,问题出现了,并且所有人都试图使用MERGE语句更新表,如果它尚不存在则添加一行(此查询将被调用数百万次在每个剧本中。)

MERGE table_name as table  // including UPDLOCK or ROWLOCK eventually 
                           //      results in deadlock
USING ( VALUES ( ... ) )
    AS row( ... )
    ON table.feature = row.feature
WHEN NOT MATCHED THEN
    INSERT (...)
    VALUES (...)

脚本需要立即访问表以访问分配给该行的唯一ID。

最终,其中一个脚本会引发OperationalError

  

事务(进程ID 52)在锁定资源上死锁   另一个进程并被选为死锁受害者。重新运行   事务。

1)我尝试在Python中调用try-except块:

while True:
    try:
        cur.execute(stmt)
        break
    except OperationalError:
        continue

这种方法大大减缓了这个过程。另外,我想我可能做错了(我想我可能需要重置连接......)。

2)在SQL Server中使用try-catch(如下所示......):

WHILE 1 = 1
BEGIN
    BEGIN TRY
        MERGE statement      // see above
        BREAK
    END TRY
    BEGIN CATCH
        SELECT ERROR_NUMBER() AS ErrorNumber
        ROLLBACK
        CONTINUE
    END CATCH;
END

3)还有别的吗?

感谢您的帮助。如果您需要其他详细信息等,请告诉我。

我正在使用Python 2.7,SQL Server 2008和pymssql建立连接。

0 个答案:

没有答案