我在交易管理方面遇到了一些问题。我创建了一个我的问题发生的简单场景。我的视图功能如下:
@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
切换,但我想这不是我的永久解决方案,因为在锁定之前检查权限是有意义的。 (我不确定它是否真的解决了我的问题。我做了它,现在我只是在监控)
任何人都可以帮助我吗?我的假设是对的吗?