Django 1.6, Transaction.commit_on_success с многопроцессорностью не работает

Я новичок в Django и пытаюсь написать несколько тестов.

В моем коде я делаю некоторую транзакцию. Для этой цели я заблокировал свой код, используя select_for_update в джанго. Теперь я хочу проверить, работает ли блокировка правильно или нет. Я запускаю 2 или более процессов одновременно, поэтому он разрешает только первый процесс и ждет здесь завершения первого процесса, а затем продолжается другой процесс.

#here XYZ and ABC are models.

@transaction.commit_on_success
def transaction_func():
    exp1 = ABC(a = 5)
    exp1.save()
    process_list =[]
    for i in xrange(2):
        p = Process(target=row_lock_method, args=('some_string',))
        p.start()
        time.sleep(3)
        process_list.append(p)

    for each in process_list:
        each.join()

    raise

def row_lock_method(code):
    exp2 = XYZ(b = code)
    exp2.save() 
    client = Client()
    client.login(username='[email protected]', password='sample123')
    response = client.post('some_url',{'exp2':exp2},follow=True)

Здесь приведенный выше код находится в другом файле представления. Поэтому я использовал здесь задание cron для запуска этого файла в django. Я дважды вызываю row_lock_method в transaction_func, используя process. Поскольку тест выполнен успешно, но это в реальной базе данных, поэтому я хочу отменить все изменения, сделанные в этом задании, поэтому я помещаю условие raise после обоих циклов for. Таким образом, это исключение возникает здесь, и оно откатывает его через transaction.commit_on_success. но моя проблема в том, что откат здесь не работает. Даже сообщение об ошибке не приходит.

Я делаю что-то не так. Пожалуйста, ответьте. Заранее спасибо.


person Gaurav Nagpal    schedule 08.05.2014    source источник
comment
Что вы пытаетесь протестировать? Вы обеспокоены тем, что django/innodb не является потокобезопасным или вашим кодом (или по какой-либо другой причине, связанной с многопроцессорностью)   -  person Foon    schedule 08.05.2014
comment
Вам нужно быть немного яснее. Как и почему вы используете многопроцессорность здесь? Может быть, вы должны показать код.   -  person Daniel Roseman    schedule 08.05.2014
comment
@DanielRoseman: см. ОТРЕДАКТИРОВАННУЮ часть   -  person Gaurav Nagpal    schedule 08.05.2014
comment
@DanielRoseman I Обновлен вопрос и описание. Пожалуйста, обратите внимание на это.   -  person Gaurav Nagpal    schedule 09.05.2014
comment
@GauravNagpal Это не сработает, потому что каждый новый процесс будет создавать новое соединение с БД (похоже, Django не может обмениваться соединениями между процессами?), и все изменения будут происходить вне исходной транзакции (очевидно, потому что они происходят через другое соединение). Есть ли причина, по которой вы используете многопроцессорность вместо многопоточности?   -  person freakish    schedule 09.05.2014
comment
@freakish Ранее я использовал только многопоточность. но, используя это, где я использую select_for_update, поток удерживает и блокирует эту строку бесконечное время. и это выдает мне ошибку Internal Server Error: ‹url› и OperationalError: (1205, «Превышено время ожидания блокировки; попробуйте перезапустить транзакцию»). После прочтения некоторых руководств я использовал обработку, а не многопоточность. Что мне теперь делать?   -  person Gaurav Nagpal    schedule 09.05.2014