Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何避免由于并发创建/更新而发生完整性错误?_Python_Django_Database_Postgresql_Sqlalchemy - Fatal编程技术网

Python 如何避免由于并发创建/更新而发生完整性错误?

Python 如何避免由于并发创建/更新而发生完整性错误?,python,django,database,postgresql,sqlalchemy,Python,Django,Database,Postgresql,Sqlalchemy,假设有一个模型a看起来像这样: class A(model): name = char(unique=True) 当用户尝试创建新的时,视图将检查是否已使用该名称。就像这样: name_taken = A.objects.get(name=name_passed_by_user) if name_taken: return "Name exists!" # Creating A here 它过去工作得很好,但随着系统的发展,开始出现同时尝试创建同名的。有时,多个请求在相同的几

假设有一个模型a看起来像这样:

class A(model):
    name = char(unique=True)
当用户尝试创建新的时,视图将检查是否已使用该名称。就像这样:

name_taken = A.objects.get(name=name_passed_by_user)
if name_taken:
    return "Name exists!"
# Creating A here
它过去工作得很好,但随着系统的发展,开始出现同时尝试创建同名的。有时,多个请求在相同的几毫秒内通过“名称存在检查”,导致完整性错误,因为名称字段必须是唯一的,并且多个创建特定名称的请求通过了检查

当前的解决方案是许多“try:except IntegrityError:”围绕创建部分进行包装,尽管之前进行了检查。有没有办法避免这种情况?因为有很多模型都有这样独特的约束,所以有很多丑陋的“try:except IntegrityError:”包装。是否可以锁定为不阻止选择,但锁定为阻止选择更新?或者有更合适的解决办法?我确信这是用户名和其他类似字段/列的常见问题,必须有适当的方法,而不是异常捕获


DB是Postgre10,ORM是Python的SQLAlchemy,但是直接对DB的调整也适用。

您唯一能做的就是直接将适当的参数设置为postgres。python和ORM对此都无能为力。序列化级别最有可能解决您的问题。但这可能会降低性能,因此您也应该尝试可重复读取。

您唯一能做的就是直接将适当的设置为postgres。python和ORM对此都无能为力。序列化级别最有可能解决您的问题。但是它可能会降低性能,所以您也应该尝试可重复读取。

如果您使用的是Python,您应该听说过“请求原谅,而不是许可”的设计原则

为了避免您描述的竞争条件,只需尝试将新行添加到表中。
如果您得到一个
唯一的\u违规
(SQLSTATE
23505
),回滚事务并返回名称存在。

如果您使用的是Python,您应该听说过“请求原谅,而不是许可”的设计原则

为了避免您描述的竞争条件,只需尝试将新行添加到表中。
如果您得到一个
唯一的\u冲突
(SQLSTATE
23505
),请回滚事务并返回名称存在。

谢谢,现在所有的try都是这样的:除了:'s和sessions.rollback()'s。也许不应该改变它,因为这是原则之一。只是觉得这是个糟糕的设计模式。显然不是。谢谢,现在所有的尝试都是这样的:除了:'s和sessions.rollback()。也许不应该改变它,因为这是原则之一。只是觉得这是个糟糕的设计模式。显然不是。