Как избежать ошибки «Управляемый блок завершился ошибкой COMMIT / ROLLBACK» между методами - PullRequest
1 голос
/ 06 октября 2011

У меня есть ситуация, когда я применил декоратор @action.commit_manually к методу, в котором я импортирую информацию, переданную обратно в ответе на запрос http. Мне нужно контролировать принятие и откат в зависимости от того, пройдут ли правила проверки бизнеса или нет.

Теперь, когда у меня возникает какая-то ошибка проверки, у меня есть отдельный метод, в котором я регистрирую ошибку в базе данных. Это действие всегда должно совершаться немедленно, оставляя основную транзакцию в ее текущем состоянии. Однако, что происходит, если я применяю декоратор @action.commit_on_success к процедуре захвата ошибок, моя основная транзакция также фиксируется автоматически. Если я не применяю декоратор @action.commit_on_success, то получаю сообщение об ошибке «Управляемый блок транзакций завершился с ожиданием COMMIT / ROLLBACK», как только вызывается процедура захвата ошибок.

Я использую базу данных MYSQL версии 5.1.49 с использованием механизма хранения INNODB.

Есть ли способ сохранить открытую транзакцию в вызывающей подпрограмме при фиксации транзакции во второй подпрограмме?

1 Ответ

1 голос
/ 06 октября 2011

Управление транзакциями по умолчанию в Django не поддерживает вложенные транзакции. В общем случае транзакции не могут быть вложенными. Все, что делается в разгар транзакции, либо фиксируется, либо откатывается. Поэтому, когда вы фиксируете транзакцию, независимо от того, где вы фиксируете транзакцию, она атомарна.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...