我的问题如下:
我有一个汽车经销商A,还有一个名为的数据库表sold_cars
。出售汽车时,我在此表中创建条目。
表中有一个名为的整数列order_no
。在经销商出售的汽车中,它应该是唯一的。
因此,如果经销商A售出汽车a, b and c
,则此列应为1, 2, 3
。我必须使用此列,而不是主键,因为我不想在计算中有任何空洞-经销商A和B(可能会在以后添加)应该具有订单号1、2、3,而不是A :1、3、5和B:2、4、6。所以...我为给定的经销商选择最后一个最大的order_no,将其递增1并保存。
问题是两个人在同一毫秒内从经销商A购买了汽车,并且两个订单都获得了相同的order_no。有什么建议吗?我正在考虑在事务块中关闭此过程,并锁定该表,直到事务完成为止,但是找不到有关该操作的任何信息。
我建议使用F()表达式,而不是锁定整个表。如果您的应用程序使用率很高,则锁定表将对性能产生重大影响。
您所描述的确切的情况是Django文档中提到这里。根据您的情况,以下是您可以使用的代码:
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值。另外,这种方法比带有锁定表的方法要快得多。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句