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 にアクセスするために、テーブルにすぐにアクセスする必要があります。

最終的に、スクリプトの 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 を使用して接続しています。

4

0 に答える 0