2
在我的开发机器上,我可以使用transaction.commit_on_success
和transaction.commit_manually
,但在我的生产机器上,装饰器被忽略,Django的行为就好像我的数据库不支持事务。发生这种情况无论是在我看来,功能和琐碎的测试功能我在Django的壳写:Django如何确定我的数据库是否支持事务?
>>> 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配置或其他任何地方 - 我将我的头撞在墙上,并且对任何建议都开放。
尝试做一个'SET GLOBAL general_log = 1;'在生产和开发的MySQL实例。然后在两个实例的问题中运行代码,然后比较mysql.log的详细信息。希望你会发现日志消息的差异,它会告诉你错误在哪里。 –
谢谢奥斯汀,我会试试这个,让你知道它是否告诉我任何事情。 –
要回答Django如何确定数据库是否支持事务的问题,请查看'django/db/backends/__ init __。py'文件的'BaseDatabaseFeatures'类的'supports_transactions'方法:https://github.com/django /django/blob/master/django/db/backends/__init__.py – Nick