2

私の開発マシンでは と を使用できますtransaction.commit_on_successtransaction.commit_manually、本番マシンではデコレータは無視され、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を呼び出すのではなく、モデル オブジェクトをインスタンス化してから呼び出すと、同じことが起こります。同じように失敗します。つまり、オンの位置でスタックしているように見えます。createcommit_manuallyautocommit

ただし、本番マシンのみ。すべてが私の MacBook Pro で正常に動作します。

どちらの環境も MySQL を使用しており、すべてのテーブルが InnoDB で実行されています。ジャンゴ 1.4.3、パイソン 2.6.6。

settings.py、MySQL 構成、またはその他の場所で間違っている可能性があることについての考えをいただければ幸いです。

4

1 に答える 1

1

それは次のように行われます:

from django.db import connection
if connection.features.supports_transactions:
    # We _do_ have transaction support.
else:
    # We _don't_ have transaction support. 
于 2014-11-25T14:18:13.507 に答える