Django

Django 楽観排他制御を追加する(Total:22day67h)

最初から説明します。

Django Concurrencyを利用して楽観的排他制御を実装

Djnagoで楽観的排他制御を実装するのに簡単なのは、Django Concurrencyを使って実装することです。

pip install django-concurrency

インストールが完了したら、Settingsファイルにミドルウェアを追加します。

MIDDLEWARE = [
    'concurrency.middleware.ConcurrencyMiddleware',
]

あとは、modelsにversionを追加します。

楽観排他制御用のフィールドを追加

from django.utils import timezone
from django.db import models
from concurrency.fields import AutoIncVersionField

class TimeStampedModel(models.Model):
    """
    models ([共通モデル]):
    """
    created_at = models.DateTimeField(verbose_name='作成日時', default=timezone.now)
    update_at = models.DateTimeField(verbose_name='更新日時', auto_now=True)
    version = AutoIncVersionField(verbose_name='バージョン')   # 追加

    # 抽象化設定
    class Meta:
        abstract = True

あとは、マイグレーションを実行します。

python manage.py makemigrations
python manage.py migrate

これで新規登録すると、Versionは自動で1で登録されます。
後は、保存するときにデータを取得した時のVersion№を同時に保存することで、取得時と同じ№でない時にはエラーとなります。
問題がない場合は、自動で№に1を追加したものが保存されるようになります。

ポイント

たったこれだけで楽観排他制御が実装

この状態で、更新処理をすると一番右のVersionが1に変更されます。

この状態から、先ほどと同じVersionを0で持っているデータを保存を実行しても、数字も公開未公開も変更されず排他制御がされていることが分かります。

-Django

© 2022 ごろう@縁紡ぐ