0

我有一个带有用户身份验证系统的基于 django 的网站。有一个模型(比如 A),其属性文件名必须是唯一的。单击网页上的某个按钮时,其中一个 python 视图执行以下操作

file=randomNameX()
a=A(filename=file) 
a.save()

def randomStringX(length):
    s = ''
    letters = "0123456789abcdefghijklmnopqrstuvwxyz"
    while len(s) < length:
    s += letters[random.randint(0, len(letters)-1)]
    return s

def randomNameX():
    name = randomString(10)
    while A.objects.filter(filename="_"+name).count() > 0:
    name = randomString(10)
    return name

是否有可能两个用户(用户 1 和用户 2)可能同时生成相同的文件名,并且数据库条目首先发生在用户 1 中,并且由于属性是唯一的,因此会为用户 2 引发异常?

如果是,请告诉我如何克服这个问题。

4

1 回答 1

0

您所描述的称为竞争条件(http://en.wikipedia.org/wiki/Race_condition)。

您当前的代码是否会发生这种情况取决于“生成随机文件名”的实现,因此只有您可以说出答案,但避免此类问题的最简单方法是使用一些 UUID 系统(http://fr .wikipedia.org/wiki/Universal_Unique_Identifier),一个标准的或“自己动手”的解决方案。

给定上下文(HTTP 请求处理程序),时间戳、请求客户端的 IP 地址和一些随机内容的组合应该足以大大降低这种冲突的可能性。

于 2013-06-28T11:02:00.140 回答