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を使用しています)。
?トランザクションとは、一連のデータ変更が完全に起こるかどうかを確実にすることです。 'Account.objects.create(account_name = 'newacc')'という修正がいくつあるのかわかりませんし、上記のコードの結果が何であるかについても説明していません。 – Shadow
@ AlasdairそれはInnoDBで、チェックされています: SELECT table_name、engine FROM information_schema.tables AS tb WHERE table_schema = 'my_schema'; – reformy
私はPythonやdjangoの専門家ではありませんが、トランザクションモジュールはPythonレベルの操作ではなく、データベースレベルの操作に適用されていると思います。あなたが発生させる例外は、Pythonレベルであり、データベースレイヤーには影響しません。したがって、ロールバックはありません。 – Shadow