2017-04-10 6 views
-3

Djangoでトランザクションを使用しようとしています。それはdjangoが無視するようです。ブロックに例外がある場合、トランザクションがロールバックされ、DBが変更されないことが予想されます。ただし、後で照会するとDBが変更されます。Djangoはトランザクションを無視します

すべてのテーブルはInnoDBです。 mysql-shellのトランザクションは完全に機能します。

python 2.7.5+、mysql 5.5.54、django 1.8.7。

これは私のテストコードです:

Djangoの設定:

DATABASES = { 
    'my_app': { 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': 'my_db', 
     'USER': ROOT_USER, 
     'PASSWORD': ROOT_PASS, 
     'HOST': ROOT_HOST, 
     'PORT': '3306', 
    } 
} 

コード:

import django 
import os 

from django.db import transaction 

from my_app.models import Account 

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_proj.settings") 
django.setup() 

with transaction.atomic(): 
    Account.objects.create(account_name='newacc') 
    raise Exception('no!!!!') 

期待される結果は、このオブジェクトが実行した後、DBにはならないだろうということです。 実際には、アカウントにはDBが作成されますが、例外があります。

さらに、コードをデバッグするときに、 'raise'行で改行すると、すでにDB内に新しいオブジェクトが表示されています(workbenchを使用しています)。

+0

?トランザクションとは、一連のデータ変更が完全に起こるかどうかを確実にすることです。 'Account.objects.create(account_name = 'newacc')'という修正がいくつあるのかわかりませんし、上記のコードの結果が何であるかについても説明していません。 – Shadow

+0

@ AlasdairそれはInnoDBで、チェックされています: SELECT table_name、engine FROM information_schema.tables AS tb WHERE table_schema = 'my_schema'; – reformy

+0

私はPythonやdjangoの専門家ではありませんが、トランザクションモジュールはPythonレベルの操作ではなく、データベースレベルの操作に適用されていると思います。あなたが発生させる例外は、Pythonレベルであり、データベースレイヤーには影響しません。したがって、ロールバックはありません。 – Shadow

答えて

1

transaction.atomicを使用して()、1は、関連するDB上のトランザクションを開始する=「MY_APP」を使用して、パラメータを使用する必要があります。これは、トランザクションのテストでどのように

with transaction.atomic(using='my_app'): 
関連する問題