Django transaction.commit_on_success не откатывает транзакцию

Я пытаюсь использовать транзакции Django в MySQL с декоратор commit_on_success. Согласно документации: «Если функция вызывает исключение, Django откатывает транзакцию». Однако это, похоже, не работает для меня:

>>> @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
>>>

Я почти уверен, что MySQL поддерживает транзакции; мне нужно использовать другой тип таблицы или что-то в этом роде?


person Eli Courtwright    schedule 31.07.2009    source источник
comment
В Постгресе работает нормально. Я не знаю, почему люди используют MySQL.   -  person Glenn Maynard    schedule 31.07.2009
comment
@GlennMaynard Я верю, потому что это легче произносить   -  person Tommaso Barbugli    schedule 20.11.2012


Ответы (2)



По-видимому, MySQL не поддерживает транзакции с таблицами MyISAM, которые являются типом таблиц по умолчанию. Таблицы InnoDB поддерживают транзакции, поэтому я создам таблицы заново, а затем посмотрю, будут ли работать транзакции.

person Eli Courtwright    schedule 31.07.2009
comment
Использование по умолчанию хранилища таблиц, которое не поддерживает транзакции, достаточно, чтобы убедить меня никогда не приближаться к MySQL. Это как машина с подушками безопасности, которые нужно включать самому. Честно говоря, это настолько абсурдно, что я боюсь, какие еще сломанные дефолты у них подстерегают. - person Glenn Maynard; 31.07.2009