Django:复制数据库中的对象

时间:2013-10-10 18:04:15

标签: django transactions mutex concurrent-programming python-decorators

我在交易管理方面遇到了一些问题。我创建了一个我的问题发生的简单场景。我的视图功能如下:

@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切换,但我想这不是我的永久解决方案,因为在锁定之前检查权限是有意义的。 (我不确定它是否真的解决了我的问题。我做了它,现在我只是在监控)

任何人都可以帮助我吗?我的假设是对的吗?

0 个答案:

没有答案