2011-08-19 4 views
0

J'essaie d'effectuer des tâches transactionnelles en vertu desquelles la tâche annulera les mises à jour de la base de données si elle ne parvient pas à envoyer l'e-mail.django djcelery: la construction d'une tâche transactionnelle ne se résorbe pas

Ci-dessous est mon code, n'importe qui peut conseiller ce qui ne va pas ici?

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

Qu'est-ce qui se passe, et ce que vous attendez? Des informations sur le moteur de base de données que vous utilisez seraient également utiles. – SteveMc

+0

Je m'attends à ce que la transaction soit annulée lorsqu'elle tombe dans l'exception. Mais ce n'est pas comme pour le moteur de base de données que j'utilise MySQL –

Répondre

1

Puisque vous utilisez MySQL, la première chose que vous devez vérifier est de savoir si le moteur de base de données que vous utilisez supporte les transactions en premier lieu et si les transactions ont été activées dans la configuration MySQL.

Voir ce lien pour plus d'informations sur les questions de transaction MySQL/Django: https://docs.djangoproject.com/en/dev/ref/databases/#storage-engines

+0

Presque toutes les questions sur SO à propos de Django et des bases de données peuvent être résolues avec "ne pas utiliser MyISAM :-)" – SteveMc

Questions connexes