Django ORM和锁定表

Marek M.

我的问题如下:

我有一个汽车经销商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。有什么建议吗?我正在考虑在事务块中关闭此过程,并锁定该表,直到事务完成为止,但是找不到有关该操作的任何信息。

LNI

我建议使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章