2009-07-31 23 views
2

私はthe commit_on_success decoratorでMySQL上でDjangoトランザクションを使用しようとしています。ドキュメントによると、 "関数が例外を発生させた場合でも、Djangoはトランザクションをロールバックします。"しかし、これは私にとってはうまくいかないようです:Django transaction.commit_on_successがトランザクションをロールバックしない

>>> @transaction.commit_on_success 
... def fails(): 
...  Site.objects.create(name="New Site", ip_address="127.0.0.1") 
...  raise ValueError("oh noes!") 
... 
>>> Site.objects.count() 
2 
>>> fails() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.6/site-packages/django/db/transaction.py", line 240, in _commit_on_success 
    res = func(*args, **kw) 
    File "<stdin>", line 4, in fails 
ValueError: oh noes! 
>>> Site.objects.count() 
3 
>>> 

私はMySQLがトランザクションをサポートしていることを確信しています。別のテーブルタイプなどを使用する必要がありますか?

+5

作品罰金が。私は知らない。私はので、信じて –

+2

@GlennMaynard発音するのが簡単です –

答えて

8

http://docs.djangoproject.com/en/dev/ref/databases/から:。。

「デフォルトのエンジンはMyISAMの[1]のMyISAMの主な欠点は、それが現在のトランザクションや外部キーをサポートしていないということですプラス側では、現在そのエンジンのみですフルテキストインデックスと検索をサポートしています。

は「InnoDBエンジンが完全なトランザクション機能と外部キー参照をサポートしています。」人々はMySQLを使用する理由はPostgresで

+0

誰かが自分のdownvoteを説明したいですか? –

+2

これは、下のOPによって既に言われていなかったことは何も言いません。 –

3

明らかに、MySQLはテーブルのデフォルトタイプであるMyISAMテーブルとのトランザクションをサポートしていません。 InnoDBテーブルはトランザクションをサポートしているので、テーブルを再作成してトランザクションが動作するかどうかを確認します。

+3

d私はMySQLに近づかないことを私に納得させるのに十分です。それはあなたがあなた自身をオンにしなければならないエアバッグ付きの車のようなものです。率直に言って、私は彼らが待っている他の壊れたデフォルトが何を恐れているのだろうというのはとても不条理です。 –

関連する問題