Mysql вставить строку, игнорирующую текущую транзакцию - PullRequest
1 голос
/ 14 февраля 2012

У меня есть таблица MySQL, реализующая почтовую очередь, и я также использую ее для отправки почты, которая сообщает о непредвиденных ошибках в системе. Иногда эти непредвиденные ошибки возникают внутри транзакции, поэтому, когда я выполняю откат транзакции, я также отменяю строку, вставленную (сообщение, сообщающее о неожиданной ошибке) в таблицу почтовой очереди.

Мой вопрос: как я могу принудительно вставить строку в таблицу в середине транзакции, игнорируя возможный откат транзакции ?. Я имею в виду, что если транзакции, в конце концов, будут откатаны, не нужно откатывать также вставку строк для электронного письма, сообщающего подробности ошибки.

Эта таблица может быть прочитана несколькими асинхронными процессами для отправки писем в очереди, поэтому в этом случае строки должны быть заблокированы для отправки только один раз, поэтому невозможно использовать тип таблицы MyISAM и использует Innodb .

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 14 февраля 2012

Если вы INSERT должны пережить ROLLBACK транзакции, можно с уверенностью сказать, что она не является частью транзакции. Так что вы должны просто переместить его за пределы транзакции. Есть много способов добиться этого:

  • Во время транзакции вместо запуска INSERT сохраните поля в переменных сеанса (они выживут ROLLBACK), после транзакция запускает вставку из переменных сеанса
  • Переосмыслите свою схему - это пахнет какой-то более глубокой проблемой
  • Откройте второе соединение с БД и запустите на этом INSERT, транзакция на первом соединении не будет затронута.
0 голосов
/ 14 февраля 2012

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

...