#mysql #transactions
#mysql #транзакции
Вопрос:
Я выполнил несколько запросов SQL-оператора между START TRANSACTION
ними и COMMIT
.
Если что-то пойдет не так, процесс завершится между ними без выполнения COMMIT
, и с базой данных ничего не произойдет. Пока все кажется нормальным без выполнения ROLLBACK
.
Я сомневаюсь в том, нужно ли бежать ROLLBACK
, если случится что-то плохое?
Комментарии:
1. Если что-то пойдет не так, процесс завершится , это абсолютно неверно. Никогда не полагайтесь на неявные действия. Определите надлежащие обработчики выхода и выполните в нем явный ОТКАТ.
2. @Akina Это так верно. Каждая платформа / решение может вести себя немного по-разному в условиях ошибок, и я видел, что транзакции были совершены даже после того, как некоторые ошибки должны были привести к гибели транзакции. Итак, к делу, лучше явно вызвать ОТКАТ и спокойно спать по ночам.
3. @TheImpaler Достаточно представить, что в середине транзакции ссылка была потеряна, а затем восстановлена путем повторного подключения — но это другое соединение… прощай, согласованность!
Ответ №1:
Если вы autocommit
отключили, любая не совершенная транзакция всегда откатывается в конце сеанса.
Подробнее об этом можно прочитать в документации
Тем не менее, я бы четко об этом сказал (на всякий случай, если сеанс не завершится, когда «что-то пойдет не так») и вызовите его.
Комментарии:
1. В документации я нашел 1 полезную информацию о
rollback
том, что «Как ФИКСАЦИЯ, так и ОТКАТ освобождают все блокировки InnoDB, которые были установлены во время текущей транзакции». что я интерпретирую как, если не происходит блокировки InnoDB, иначе запускROLLBACK
не требуется. В любом случае спасибо за информацию.2. @mjb ну, MyISAM на самом деле не поддерживает транзакции, так что да, откат в MyISAM не требуется … но ни фиксация, ни транзакция вообще не нужны