2011-08-19 75 views
0

正在嘗試執行事務性任務,由此如果任務未能發送電子郵件,任務將回滾數據庫更新。django djcelery:構建事務性任務不會回滾

下面是我的代碼,任何人都可以在這裏建議做錯了什麼?

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

發生了什麼事,和你有什麼期待?有關您正在使用的數據庫引擎的信息也會有所幫助。上午 – SteveMc

+0

上午期望交易在異常情況下回滾。但它不像數據庫引擎使用它的MySQL –

回答

1

由於您使用的是MySQL,因此首先需要檢查您正在使用的數據庫引擎是否首先支持事務,以及事務是否已在MySQL配置中啓用。

查看的MySQL/Django的交易問題,此鏈接瞭解更多信息:https://docs.djangoproject.com/en/dev/ref/databases/#storage-engines

+0

幾乎關於Django和數據庫的所有問題都可以用「不要使用MyISAM :-)」來回答「 – SteveMc