【问题标题】:django djcelery: building a transactional task is not rolling backdjango djcelery:构建事务性任务不会回滚
【发布时间】:2011-08-19 16:51:10
【问题描述】:

我正在尝试执行事务性任务,如果无法发送电子邮件,该任务将回滚数据库更新。

以下是我的代码,任何人都可以建议这里做错了什么?

from celery.task import task
from django.core.mail import send_mail, send_mass_mail
from django.db import transaction


@task(name='communicator.process_emails')
@transaction.commit_manually
def process_emails():
    from models import Comm_Queue
    try:
        message = []
        for i in Comm_Queue.objects.filter(status='P').order_by('sender_email'):
            message.append((i.subject, i.content, i.sender_email, [i.recipient_email]))
            Comm_Queue.objects.filter(id=i.id).update(status='S')
        if send_mass_mail(message):
            transaction.commit()
    except Exception, e:
        print 'rolled back (exception): %s' % e.__str__()
        transaction.rollback()

【问题讨论】:

  • 发生了什么,您期待什么?有关您正在使用的数据库引擎的信息也会有所帮助。
  • 希望事务在异常中回滚。但它不像数据库引擎正在使用它的 MySQL

标签: django celery django-celery


【解决方案1】:

由于您使用的是 MySQL,首先需要检查的是您使用的数据库引擎是否支持事务,以及是否在 MySQL 配置中启用了事务。

有关 MySQL/Django 事务问题的更多信息,请参阅此链接:https://docs.djangoproject.com/en/dev/ref/databases/#storage-engines

【讨论】:

  • 几乎所有关于 Django 和数据库的 SO 问题都可以用“不要使用 MyISAM :-)”来回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 2020-02-18
相关资源
最近更新 更多