首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django-celery任务和django事务

Django-celery任务和django事务
EN

Stack Overflow用户
提问于 2012-09-13 18:51:59
回答 2查看 814关注 0票数 2

我有一个关于事务和芹菜任务的问题。所以这对我来说并不神秘,当然,如果你有一个事务和一个芹菜任务访问同一个表/记录,我们就会有一个竞争条件。

但是,请考虑以下代码:

代码语言:javascript
复制
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__)

下面是芹菜的任务:

代码语言:javascript
复制
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

我的问题

既然我们确实在创建任务之前提交了,那么是否仍然有可能存在竞争条件?

其他信息

  • 我们正在使用Postgres版本9.1
  • 每个事务都是以读提交隔离级别运行的
  • 位于另一个具有引擎的数据库上dowant.lib.db.backends.postgresql_psycopg2_debugger field_a已经设置,并且任务按预期工作。对于engine dowant.lib.db.backends.postgresql_psycopg2_hstore_ready,出现了上述问题(不确定是否与engine).
  • Celery版本是2.2
  • 有关,我尝试了不同的数据库。仍然是相同的行为,除非引擎发生了变化。这就是我提到这一点的原因。

非常感谢。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12404593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档