2

私は夜間に実行される2つの単純な定期的なセロリタスクを持っていdjcelery_periodictaskます。djcelery_periodictask他のタスクがまだ共有ロックを保持している間に、あるタスクが更新を試みているようです。

deadlock detected Detail: Process 32353 waits for ShareLock on transaction 39280165; blocked by process 32306. Process 32306 waits for ShareLock on transaction 39280166; blocked by process 32353. 
Process 32353: 
UPDATE "djcelery_periodictask" SET "name" = 'app.tasks.task1', "task" = 'app.tasks.task1', "interval_id" = NULL, "crontab_id" = 4, "args" = '[]', "kwargs" = '{}', "queue" = NULL, "exchange" = NULL, "routing_key" = NULL, "expires" = NULL, "enabled" = true, "last_run_at" = '2015-02-10 03:00:00.001297+01:00', "total_run_count" = 117, "date_changed" = '2015-02-10 02:00:00.010033+00:00', "description" = '' WHERE "djcelery_periodictask"."id" = 4 
Process 32306: 
UPDATE "djcelery_periodictask" SET "name" = 'app.tasks.task2', "task" = 'app.tasks.task2', "interval_id" = NULL, "crontab_id" = 6, "args" = '[]', "kwargs" = '{}', "queue" = NULL, "exchange" = NULL, "routing_key" = NULL, "expires" = NULL, "enabled" = true, "last_run_at" = '2015-02-10 02:00:00.014189+01:00', "total_run_count" = 63, "date_changed" = '2015-02-10 02:00:00.015097+00:00', "description" = '' WHERE "djcelery_periodictask"."id" = 6 
Hint: See server log for query details. Query: 
UPDATE "djcelery_periodictask" SET "name" = 'app.tasks.task2', "task" = 'appt.tasks.task2', "interval_id" = NULL, "crontab_id" = 4, "args" = '[]', "kwargs" = '{}', "queue" = NULL, "exchange" = NULL, "routing_key" = NULL, "expires" = NULL, "enabled" = true, "last_run_at"

ほんの数行を含むテーブルでの 2 つの単純な更新がデッドロックになるのはどうしてでしょうか?

4

1 に答える 1

1

私の問題は-B、定期的なタスクスケジューラで各ワーカーを有効にするパラメーターですべてのワーカーを開始したことです。

-B, --beat            Also run the celery beat periodic task scheduler.
                      Please note that there must only be one instance of
                      this service.

その結果、スケジュールされたタスクが複数回同時に開始され、djcelery_periodictaskテーブルを更新しようとするとデッドロックが発生しました。

于 2015-02-13T09:13:02.207 に答える