Отключить автокоммит во время сотен операторов MySQL UPDATE в программе Django - PullRequest
4 голосов
/ 07 сентября 2010

В программе Django, как явно отключить автоматическое управление транзакциями перед сотнями ОБНОВЛЕНИЙ и включить его после завершения ОБНОВЛЕНИЙ?

Я изучил 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;')

Ни один из перечисленных методов не улучшил скорость обновления.Что-то не так с вышеуказанными кодами?

Ответы [ 2 ]

3 голосов
/ 24 февраля 2011
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).

Чтобы получить полный контроль над транзакциями, вы можете использовать декораторaction.commit_manually. Что касается вашей скорости, я не могу комментировать.

Документы Django объясняют это очень хорошо: http://docs.djangoproject.com/en/dev/topics/db/transactions/#django.db.transaction.commit_on_success

0 голосов
/ 19 сентября 2010

Если вы делаете только сотни обновлений, а не десятки тысяч, возможно, проблема в скорости связана не с записью данных, а с поиском. то есть, возможно, в операторе update есть предложение where, и для поиска правильной строки, которую нужно обновить, требуется некоторое время. Если это так, то отключение автоматической фиксации не поможет - вам понадобится индекс для поля в предложении where.

Сколько строк в таблице? Как выглядит оператор обновления?

Вы также можете попробовать подготовленные заявления, но для менее тысячи обновлений это не должно иметь большого значения.

...