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

哪里@distributedlock是分布式互斥锁,以防止两个进程同时执行。我的目标是防止重复的对象。

问题是我得到了重复的对象,即两个Person具有相同名称的对象,它只发生在并发请求中。

我猜@permission_required是创建一个事务,然后请求被锁定@distributedlock。实际上,当它恢复时,该对象并不存在于该事务中。

我做了一个变通方法切换@permission_required@distributedlock但我想这不是我的永久解决方案,因为在锁定之前检查权限是有意义的。(我不确定它是否真的解决了我的问题。我做到了,现在我只是在监控)

谁能帮我?我的假设对吗?

4

0 回答 0