按列值的 Django 事务

Django Transaction By Column Value

我是运行一群异步工作者,想通过以下方式创建交易:

更新

我想确保:

两个 aysnc 工作人员没有覆盖同一个行程

两个异步工作人员没有将汽车分配给同一个行程

def my_func(ride_id):
    ride = Ride.objects.get(id=ride_id)
    if not ride.driver_id:
        with transaction.atomic():
            driver_id = find_best_driver_not_assigned() # this could return same driver in two different workers
            # This code executes inside a transaction.
            ride.driver_id = 1
            ride.save()

driver_id 栏原本是空白的。但是,无论谁 "wins" 或更新该字段,都应该阻止来自其他异步芹菜工作者的任何其他写入。

问题是此 ride 条目的 route 字段每秒更新一次,我只希望在有人尝试更新 driver_id 字段时出现异常。

这行得通吗?

不,那行不通,因为您已将 driver_id 支票放在交易之外。

幸运的是,您根本不需要事务处理,因为您可以在 Django 中自动完成获取和设置/SQL:

is_new_driver = Ride.objects.filter(id=ride_id, driver_id=None).update(driver_id=1)

如果尚未设置 driver_id,那将自动设置 driver_id,您可以使用 return 值来确定是否是这种情况。请参阅 documentation for update(),其中注释:

Using update() also prevents a race condition wherein something might change in your database in the short period of time between loading the object and calling save().