Django的transaction.commit_on_success不回滚事务

2 投票
2 回答
3527 浏览
提问于 2025-04-15 13:18

我正在尝试在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 引擎是完全支持事务的,并且支持外键引用。”

撰写回答