Python 如何避免由于并发创建/更新而发生完整性错误?
假设有一个模型a看起来像这样: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 它过去工作得很好,但随着系统的发展,开始出现同时尝试创建同名的。有时,多个请求在相同的几
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违规
(SQLSTATE23505
),回滚事务并返回名称存在。如果您使用的是Python,您应该听说过“请求原谅,而不是许可”的设计原则
为了避免您描述的竞争条件,只需尝试将新行添加到表中。
如果您得到一个
唯一的\u冲突
(SQLSTATE23505
),请回滚事务并返回名称存在。谢谢,现在所有的try都是这样的:除了:'s和sessions.rollback()'s。也许不应该改变它,因为这是原则之一。只是觉得这是个糟糕的设计模式。显然不是。谢谢,现在所有的尝试都是这样的:除了:'s和sessions.rollback()。也许不应该改变它,因为这是原则之一。只是觉得这是个糟糕的设计模式。显然不是。