代码之家  ›  专栏  ›  技术社区  ›  Eli Courtwright

django transaction.commit在成功时不回滚事务

  •  2
  • Eli Courtwright  · 技术社区  · 15 年前

    我尝试在mysql上使用django事务 the commit_on_success decorator . 根据文档,“如果函数引发异常,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 回复  |  直到 15 年前
        1
  •  8
  •   Fred Larson    15 年前

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

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

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

        2
  •  3
  •   Eli Courtwright    15 年前

    显然,mysql不支持使用myisam表的事务,myisam表是默认的表类型。InnoDB表确实支持事务,所以我将重新创建表,然后查看事务是否工作。