2013-02-04 35 views
2

在我的开发机器上,我可以使用transaction.commit_on_successtransaction.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配置或其他任何地方 - 我将我的头撞在墙上,并且对任何建议都开放。

+1

尝试做一个'SET GLOBAL general_log = 1;'在生产和开发的MySQL实例。然后在两个实例的问题中运行代码,然后比较mysql.log的详细信息。希望你会发现日志消息的差异,它会告诉你错误在哪里。 –

+0

谢谢奥斯汀,我会试试这个,让你知道它是否告诉我任何事情。 –

+1

要回答Django如何确定数据库是否支持事务的问题,请查看'django/db/backends/__ init __。py'文件的'BaseDatabaseFeatures'类的'supports_transactions'方法:https://github.com/django /django/blob/master/django/db/backends/__init__.py – Nick

回答

0

它的完成这样的:

from django.db import connection 
if connection.features.supports_transactions: 
    # We _do_ have transaction support. 
else: 
    # We _don't_ have transaction support. 
相关问题