2009-07-31 9 views
2

J'essaie d'utiliser les transactions Django sur MySQL avec the commit_on_success decorator. Selon la documentation, "Si la fonction déclenche une exception, cependant, Django annulera la transaction." Cependant, cela ne semble pas fonctionner pour moi:Django transaction.commit_on_success ne pas annuler la transaction

>>> @transaction.commit_on_success 
... def fails(): 
...  Site.objects.create(name="New Site", ip_address="127.0.0.1") 
...  raise ValueError("oh noes!") 
... 
>>> Site.objects.count() 
2 
>>> fails() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.6/site-packages/django/db/transaction.py", line 240, in _commit_on_success 
    res = func(*args, **kw) 
    File "<stdin>", line 4, in fails 
ValueError: oh noes! 
>>> Site.objects.count() 
3 
>>> 

Je suis assez sûr que MySQL supporte les transactions; Dois-je utiliser un type de table différent ou quelque chose?

+5

fonctionne très bien dans Postgres. Je ne sais pas pourquoi les gens utilisent MySQL. –

+2

@GlennMaynard Je crois que il est plus facile de prononcer –

Répondre

8

De http://docs.djangoproject.com/en/dev/ref/databases/:..

« Le moteur par défaut est MyISAM [1] L'inconvénient principal de MyISAM est qu'il ne supporte pas les transactions ou les clés étrangères Du côté positif, il est actuellement le seul moteur prend en charge l'indexation en texte intégral et la recherche.

« Le moteur InnoDB est entièrement transactionnel et prend en charge les références clés étrangères. »

+0

Est-ce que quelqu'un aimerait expliquer leur downvote? –

+2

Cela ne dit rien qui n'a pas été dit déjà par l'OP ci-dessous. –

3

Apparemment, MySQL ne prend pas en charge les transactions avec les tables MyISAM, qui est le type de tables par défaut. Les tables InnoDB supportent les transactions, donc je vais recréer les tables et ensuite voir si les transactions fonctionnent alors.

+3

Défaut de stocker le stockage Il n'y a pas assez de transactions de support pour me convaincre de ne jamais s'approcher de MySQL. C'est comme une voiture avec des airbags que vous devez allumer vous-même. Franchement, c'est tellement absurde que j'aurais peur des autres défauts de paiement qu'ils ont en attente. –

Questions connexes