我有一个关于事务和芹菜任务的问题。所以这对我来说并不神秘,当然,如果你有一个事务和一个芹菜任务访问同一个表/记录,我们就会有一个竞争条件。
但是,请考虑以下代码:
def f(self):
# function of module that inherits from models.Model
self.field_a = datetime.now()
self.save()
transaction.commit_unless_managed()
# depending on the configuration of this module
# this might return None or a datetime object.
eta = self.get_task_eta()
if eta:
celery_task_do_something.apply_async(args=(self.pk, self.__class__),
eta=eta)
else:
celery_task_do_something.delay(self.pk, self.__class__)
下面是芹菜的任务:
def celery_task_do_something(pk, cls):
o = cls.objects.get(pk=pk)
if o.field_a:
# perform something
return True
return False
正如您所看到的,在创建任务之前,我们调用transaction.commit_unless_managed
,它应该提交,因为django事务当前不是托管的。
但是,在运行芹菜任务时,未设置字段field_a
。
我的问题
既然我们确实在创建任务之前提交了,那么是否仍然有可能存在竞争条件?
其他信息
dowant.lib.db.backends.postgresql_psycopg2_debugger
field_a
已经设置,并且任务按预期工作。对于engine dowant.lib.db.backends.postgresql_psycopg2_hstore_ready
,出现了上述问题(不确定是否与engine).非常感谢。
https://stackoverflow.com/questions/12404593
复制相似问题