4

共通のデータベース サーバーに接続された複数の Web ホストで Django を実行しています。データベースには、保留中のジョブの単純なテーブルが含まれています。例えば

class Job(models.Model):

    name = models.CharField(max_length=255, null=False, help_text='task to do')
    worker = models.CharField(max_length=255, null=True, help_text='globally unique host name')

Django の ORM を使用して保留中のジョブ (worker が null の場合) をクエリし、アトミックにワーカー名を設定して、2 つの Django プロセスが誤って同じジョブを取得しないようにするには (競合状態を回避するには) はどうすればよいですか?

理想的には、テーブル ロック内でクエリ/更新によって単純にラップしたいのですが、Django の ORM にはこの機能が組み込まれていないようです。

4

1 に答える 1

2

他の人が述べたように、セロリはこれに最適なツールです. Celery を使用したくない場合:

  • 最新の Django を使用している場合は、select_for_update()を使用して Job をクエリし、worker フィールドに入力します。それが、Django ORM で求められていた「テーブル ロック」です。影響を受ける行のみをロックするため、より多くの並行性を許可することで、テーブル ロックよりも優れています。

  • 利用できない古いバージョンを使用している場合はselect_for_update()、重要なセクションを保護するために「テーブルのロック」(10 行程度の簡単なもの) を実装してください。

于 2012-05-21T16:46:40.713 に答える