按列值的 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()
.
我是运行一群异步工作者,想通过以下方式创建交易:
更新
我想确保:
两个 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 callingsave()
.