我的问题是:

我有一个汽车经销商A,还有一个名为sold_cars的数据库表.当出售一辆汽车时,我在这个表中创建条目.

表中有一个名为order_no的整数列.它在经销商销售的汽车中应该是独一无二的.

所以如果经销商A卖出了a辆、b辆和c辆汽车,那么这一列应该是1, 2, 3辆.我必须使用此列,而不是主键,因为我不想让我的数字中有任何漏洞-经销商A和B(稍后可能会添加)的订单号应该是1、2、3,而不是A:1、3、5和B:2、4、6.我为给定的庄家 Select 最后最大的order_no,将其加1并保存.

问题是,两个人在同一毫秒内从经销商A那里购买了汽车,两个订单都得到了同样的order_no美元.有什么建议吗?我想在挡路交易中关闭此流程,并锁定此表,直到交易完成,但找不到任何有关如何操作的信息.

推荐答案

我建议使用F() expression,而不是锁定整个表格.如果您的应用程序使用率很高,则锁定表将会对性能产生重大影响.

Django文档here中提到了您描述的确切场景.根据您的场景,以下是您可以使用的代码:

from django.db.models import F


# Populate sold_cars as you normally do..
# Before saving, use the "F" expression
sold_cars.order_num =F('order_num') + 1
sold_cars.save()

# You must do this before referring to order_num:
sold_cars.refresh_from_db()
# Now you have the database-assigned order number in sold_cars.order_num

请注意,如果在更新操作期间设置order_num,请改用以下内容:

sold_cars.update(order_num=F('order_num')+1)
sold_cars.refresh_from_db()

因为数据库负责更新字段,所以不会有任何争用条件或重复的order_num值.另外,这种方法比使用锁定表的方法要快得多.

Django相关问答推荐

以特定顺序获取模型实例时出现问题

未显示SWAGER上的一些示例架构

在Django的反向函数中添加动态URL

在Django管理中仅显示外键的特定值

从Azure Web应用服务器上的cron任务的虚拟环境加载变量

Django:如何 Select 没有其他项目引用的项目?

如何在视图中的 Django 重定向末尾附加字符串?

获取 Django Rest API 的第一个和最后一个相关对象

为什么我的搜索功能返回错误相关字段查找无效:​​类别

Django 长时间运行带有线程/处理的异步任务

如何让两个模型相互引用 Django

使用 Django 和 South 重命名应用程序

(fields.E300) 字段定义与模型的关系,该模型要么未安装,要么是抽象的

更新Django模型对象多个字段的有效方法

Django:创建索引:非唯一,多列

如何在 Django 和 django-jsonfield 中将 JSONField 的默认值设置为空列表?

如何在 Django 1.9 中删除 DB (sqlite3) 以从头开始?

如何在 django 中使用更少的 css?

Django - 保存新对象时如何获取 self.id?

如何更改 ModelForm 中所有 Django 日期字段的默认小部件?