に対処する最善の方法は何ですか
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 にアクセスするために、テーブルにすぐにアクセスする必要があります。
最終的に、スクリプトの 1 つが次のエラーを発生させます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 を使用して接続しています。