2016-12-28 12 views
1

Моя оболочка базы данных должна знать, когда оператор выполняется как часть транзакции (а не автоматически). Я устанавливаю флаг, когда beginTransaction() вызывается и очищает его снова при вызове commit() или rollback().INNODB: В чем заключена сделка?

Вопрос в том, что еще может привести к прекращению транзакции? Например, мне нужно будет проверить ошибки, когда соединение потеряно или транзакция была убита из-за тупика.

ответ

0
  • Любой DDL (ALTER, DROP, ...) завершает сделку. (Это отличается от других поставщиков.)

  • Икота в сети прекратит транзакцию. По этой причине неразумно включать «автообновление». Я подозреваю, что если у вас есть autocommit = 0, вы не можете распознать икоту.

Я считаю, что это очень рискованно иметь autocommit=0 - это слишком легко забывают (или иным образом не) для выполнения необходимых COMMIT. Вместо этого я предпочитаю иметь BEGIN и COMMIT в такой же клиентская подпрограмма. Да, это может привести к реструктуризации подпрограмм по-разному, но, имея BEGIN и COMMIT «вместе», я с меньшей вероятностью испортил транзакции.

Проверьте ошибки после каждые заявление. С Galera даже COMMIT может потерпеть неудачу. (Потому что это когда другие узлы консультируются.)

 Смежные вопросы

  • Нет связанных вопросов^_^