2

最好的处理方法是什么

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 进行连接。

4

0 回答 0