5

Djangoプログラムで、何百ものUPDATEの前に自動トランザクション管理を明示的に無効にし、UPDATEの終了後に有効にする方法は?

http://docs.djangoproject.com/en/dev/topics/db/transactions/を調べましたが、手がかりが見つかりませんでした。

最初に次のコードを入れてみました

settings.DISABLE_TRANSACTION_MANAGEMENT = True

私も試しました

cursor = connection.cursor()
cursor.execute('SET SESSION autocommit = 0;')
...
UPDATE
...
cursor.execute('SET SESSION autocommit = 1;')

上記のいずれの方法でも、更新速度は向上しませんでした。上記のコードに問題はありますか?

4

2 に答える 2

3
from django.db import transaction

@transaction.commit_on_success
def my_function_that_does_thousands_of_updates():

    # Do whatever you want here
    transaction.set_dirty()

これにより、実行したい SQL を実行し、例外がない場合にのみコミットできます。例のように手動カーソルを使用している場合は set_dirty() 呼び出しが必要ですが、Django ORM を使用するだけの場合は必要ありません (私が間違っていなければ、これは少なくとも 1.2 の動作です)。

トランザクションを完全に制御するには、transaction.commit_manually デコレーターを使用できます。速度の問題については、コメントできません。

django ドキュメントはこれをかなりよく説明しています: http://docs.djangoproject.com/en/dev/topics/db/transactions/#django.db.transaction.commit_on_success

于 2011-02-24T04:03:00.737 に答える
0

数万回ではなく数百回の更新のみを行っている場合、速度の問題はデータの書き込みではなく、データの検索に起因する可能性があります。つまり、更新ステートメントに where 句があり、更新する正しい行を見つけるのに時間がかかる可能性があります。その場合、自動コミットをオフにしても役に立ちません。where 句のフィールドにインデックスが必要です。

テーブルには何行ありますか? 更新ステートメントはどのように見えますか?

準備済みステートメントを試すこともできますが、更新が 1,000 回未満の場合、大きな違いはありません。

于 2010-09-19T19:15:55.580 に答える