最好的处理方法是什么
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 进行连接。