处理
的最佳方法是什么从Python调用SQL Server时出现1205“死锁受害者”
错误?
当我运行多个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)在锁定资源上死锁 另一个进程并被选为死锁受害者。重新运行 事务。
while True:
try:
cur.execute(stmt)
break
except OperationalError:
continue
这种方法大大减缓了这个过程。另外,我想我可能做错了(我想我可能需要重置连接......)。
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
感谢您的帮助。如果您需要其他详细信息等,请告诉我。
我正在使用Python 2.7,SQL Server 2008和pymssql建立连接。