在我的开发机器上,我可以使用transaction.commit_on_success
和transaction.commit_manually
,但在我的生产机器上,装饰器被忽略,Django就像我的数据库不支持事务一样。在我的视图函数和我在Django shell中编写的普通测试函数中都会发生这种情况:
>>> from django.db import transaction
>>> from myapp.models import *
>>> @transaction.commit_on_success
... def blah():
... MyModel.objects.create(name="wazzup")
... raise Exception
...
>>> blah()
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/opt/local/python-environments/myenv/lib/python2.6/site-packages/django/db/transaction.py", line 209, in inner
return func(*args, **kwargs)
File "<console>", line 4, in blah
Exception
>>> MyModel.objects.all()
[<MyModel: wazzup>]
如果我实例化模型对象然后在它们上调用save
而不是仅在管理器上调用create
,则会发生同样的事情。 commit_manually
以同样的方式失败。总而言之,autocommit
似乎卡在了开启位置。
但仅限于生产机器。我的MacBook Pro上一切正常。
这两个环境都使用MySQL和InnoDB上运行的所有表。 Django 1.4.3,Python 2.6.6。
我很感激任何关于我在settings.py中,在我的MySQL配置中或其他任何地方可能出错的想法 - 我正在敲打我的头,并且对任何建议都持开放态度。
答案 0 :(得分:0)
它是这样做的:
from django.db import connection
if connection.features.supports_transactions:
# We _do_ have transaction support.
else:
# We _don't_ have transaction support.