django djcelery:构建一个事务性任务不会回滚

时间:2011-08-19 16:51:11

标签: django celery django-celery

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

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

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()

1 个答案:

答案 0 :(得分:1)

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

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