我有一个关于交易和芹菜任务的问题。所以对我来说,当然,如果你有一个事务和一个 celery 任务访问同一个表/记录,我们就会有一个竞争条件,这对我来说并不神秘。
但是,请考虑以下代码:
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 事务当前不受管理。
但是,在运行 celery 任务时,该字段field_a
未设置。
我的问题:
由于我们在创建任务之前进行了提交,是否还有可能存在竞争条件?
附加信息
我们正在使用 Postgres 9.1 版
每个事务都以 READ COMMITTED 隔离级别运行
在具有引擎的不同数据库上
dowant.lib.db.backends.postgresql_psycopg2_debugger
field_a
已经设置并且任务按预期工作。使用引擎dowant.lib.db.backends.postgresql_psycopg2_hstore_ready
会出现所描述的问题(不确定它是否与引擎有关)。芹菜版本是2.2
我尝试了不同的数据库。仍然是相同的行为,除非引擎发生变化。所以这就是我提到这个的原因。
非常感谢。