トランザクション管理に問題があります。問題が発生する簡単なシナリオを作成しました。私のビュー関数が続きます:
@permission_required('person.create')
@distributedlock
@commit_on_success
def view(request, name):
obj = get_object_or_none(Person, name=name)
if obj is None:
obj = Person(name=name)
obj.save()
return HttpResponse('Object created successfully.')
else:
return HttpResponse('Object already exists.')
@distributedlock
2 つのプロセスが同時に実行されるのを防ぐ分散ミューテックスはどこにありますか。私の目標は、オブジェクトの重複を防ぐことです。
問題は、重複したオブジェクト、つまりPerson
同じ名前の 2 つのオブジェクトを取得していることです。これは同時リクエストで発生します。
トランザクションを作成していると思い@permission_required
ますが、リクエストはロックされ@distributedlock
ます。再開すると、実際には、オブジェクトはそのトランザクションに存在しません。
で回避策を切り替え@permission_required
まし@distributedlock
たが、ロックする前に権限を確認するのが理にかなっているため、永続的な解決策にはならないと思います。(それが本当に私の問題を解決するかどうかはわかりません。私はそれをやったので、今は監視しているだけです)
誰でも私を助けることができますか?私の仮説は正しいですか?