Транзакции запроса Django не полностью откатываются после вызова save (). TransactionMiddleware не работает должным образом - PullRequest
2 голосов
/ 23 ноября 2011

Исходя из моего предыдущего вопроса , я использую MySQL с движком InnoDB и настроил простую тестовую таблицу. Когда я запускаю следующий код:

c.execute("""insert into test(text) values('test1')""")
conn.commit()
c.execute("""insert into test(text) values('test2')""")

# Raise an exception to simulate an error
raise Exception('spam', 'eggs')

c.execute("""insert into test(text) values('test3')""")
conn.commit() 

Я вижу запись только для test1 в базе данных, как и ожидалось.

После создания соответствующего класса модели и запуска эквивалентного кода в Django (я указал TransactionMiddleware в settings.py):

def transaction_test(request):
    t1 = Test(text='test1')
    t2 = Test(text='test2')
    t1.save()

    # Raise an exception to simulate an error
    raise Exception('spam', 'eggs')    

    t2.save()
    return render_to_response('index.html')

Тогда я все еще вижу запись для «test1» в таблице, тогда как я ожидал, что вся транзакция откатится, включая сохранение «test1», согласно описанию, приведенному в документации для TransactionMiddleware

Кто-нибудь еще видел это? Есть ли что-то, что мне не хватает в настройках Django?

Ответы [ 2 ]

1 голос
/ 23 ноября 2011

Вы уверены , что таблица test использует механизм innodb?

Я могу поверить, что вы неправильно настроили промежуточное ПО транзакций, но если декоратор transaction.commit_on_success не работает, мне кажется, что таблица использует MyISAM.

Вы можете проверить двигатель с помощью следующей команды в оболочке mysql:

show table status where name="test";
0 голосов
/ 26 марта 2014

Если вы используете django.test.TestCase, а не django.test.TransactionTestCase, то вся операция обернута в транзакцию, которая откатывается;за исключением того, что MySQL может фиксироваться, например, при блокировке таблиц, что сбивает с толку.Я решил похожую проблему, переключив суперкласс на TransactionTestCase.

...