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