Django的transaction.commit_on_success不回滚事务
我正在尝试在MySQL上使用Django的事务功能,具体是用这个叫做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是支持事务的;我是不是需要使用其他类型的表或者其他什么设置呢?
2 个回答
3
看起来MySQL不支持使用MyISAM类型的表进行事务处理,而MyISAM是默认的表类型。相反,InnoDB类型的表是支持事务的。所以我打算重新创建这些表,然后看看事务能不能正常工作。
8
来自 http://docs.djangoproject.com/en/dev/ref/databases/:
“默认的数据库引擎是 MyISAM [1]。MyISAM 的主要缺点是它不支持事务和外键。好的一面是,它是目前唯一支持全文索引和搜索的引擎。”
“InnoDB 引擎是完全支持事务的,并且支持外键引用。”