0

トランザクション管理に問題があります。問題が発生する簡単なシナリオを作成しました。私のビュー関数が続きます:

@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.')

@distributedlock2 つのプロセスが同時に実行されるのを防ぐ分散ミューテックスはどこにありますか。私の目標は、オブジェクトの重複を防ぐことです。

問題は、重複したオブジェクト、つまりPerson同じ名前の 2 つのオブジェクトを取得していることです。これは同時リクエストで発生します。

トランザクションを作成していると思い@permission_requiredますが、リクエストはロックされ@distributedlockます。再開すると、実際には、オブジェクトはそのトランザクションに存在しません。

で回避策を切り替え@permission_requiredまし@distributedlockたが、ロックする前に権限を確認するのが理にかなっているため、永続的な解決策にはならないと思います。(それが本当に私の問題を解決するかどうかはわかりません。私はそれをやったので、今は監視しているだけです)

誰でも私を助けることができますか?私の仮説は正しいですか?

4

0 に答える 0