在我的开发机器上,我可以使用transaction.commit_on_success
and 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
卡在了 on 位置。
但仅限于生产机器上。在我的 MacBook Pro 上一切正常。
两种环境都使用 MySQL,所有表都在 InnoDB 上运行。Django 1.4.3,Python 2.6.6。
对于我在 settings.py、我的 MySQL 配置或其他任何地方可能做错的任何想法,我将不胜感激——我正在努力应对任何建议。