Django transaction.commit_on_success没有回滚事务

时间:2009-07-31 18:35:30

标签: python mysql django transactions

我正在尝试使用the commit_on_success decorator在MySQL上使用Django事务。根据文档,“如果该函数引发异常,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支持交易;我需要使用不同的表格类型吗?

2 个答案:

答案 0 :(得分:8)

来自http://docs.djangoproject.com/en/dev/ref/databases/

“默认引擎是MyISAM [1] .MyISAM的主要缺点是它目前不支持事务或外键。从好的方面来说,它是目前唯一支持全文索引和搜索的引擎。

“InnoDB引擎是完全事务性的,并支持外键引用。”

答案 1 :(得分:3)

显然MySQL不支持与MyISAM表进行交易,这是表的默认类型。 InnoDB表确实支持事务,因此我将重新创建表,然后查看事务是否有效。