powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Транзакции! Нужен ли ROLLBACK при ошибке с закрытием подключения! (autocommit=0)
7 сообщений из 7, страница 1 из 1
Транзакции! Нужен ли ROLLBACK при ошибке с закрытием подключения! (autocommit=0)
    #39840234
Перечитал кучу документации. Вроде бы всё просто:

Код: sql
1.
2.
3.
4.
set autocommit=0; //отключаем autocommit
Start transaction; (также, можно написать BEGIN; )
…какие-то действий с БД (insert, update,delete…)
commit; //Фиксация действий, запись их в физическую БД



Так вот, во всех документациях, во всех online-справочниках по MySQL указано, что если во время транзакции произойдет ошибка, то транзакция сама по себе не откатится и нужно делать ROLLBACK, даже при autocommit=0. Видимо я чего-то не понимаю. Я говорю здесь о таком случае:

Код: sql
1.
2.
3.
4.
5.
set autocommit=0; //отключаем autocommit
Start transaction; (также, можно написать BEGIN; )
…SQL ошибка во время транзакции
echo "Капец!";
exit();



Внимание вопрос! Зачем делать ROLLBACK и почему при возникновении ошибки во время транзакции и последующем НЕвыполнении commit в php скрипте ввиду остановки работы скрипта ROLLBACK не происходит самостоятельно? Ведь согласно документации нужно делать commit чтобы зафиксировать транзакцию! А раз commit мы не делали (и данные на диске после разрыва соединения не изменятся), то зачем в документации написано делать ROLLBACK?
...
Рейтинг: 0 / 0
Транзакции! Нужен ли ROLLBACK при ошибке с закрытием подключения! (autocommit=0)
    #39840466
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Воробьевпочему при возникновении ошибки во время транзакции и последующем НЕвыполнении commit в php скрипте ввиду остановки работы скрипта ROLLBACK не происходит самостоятельно?
Потому что остановка PHP скрипта не делает disconnect во время которого активные транзакции могли бы завершиться откатом.
...
Рейтинг: 0 / 0
Транзакции! Нужен ли ROLLBACK при ошибке с закрытием подключения! (autocommit=0)
    #39840640
Разрыв соединения с БД при остановке скрипта это и есть дисконнект. Неужели вы думаете что соединение продолжает висеть и чего-то ждать. Нет, оно так же завершается и со стороны MySQL и должно откатывать незакрытую транзакцию. Сегодня сам всё проверю, скорее всего документация врёт и никакой rollback не нужен иначе это бред.
...
Рейтинг: 0 / 0
Транзакции! Нужен ли ROLLBACK при ошибке с закрытием подключения! (autocommit=0)
    #39840939
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел ВоробьевРазрыв соединения с БД при остановке скрипта это и есть дисконнект.
Повторяю медленно: при остановке PHP скрипта соединение возвращается в глобальный пул, но не разрывается.
...
Рейтинг: 0 / 0
Транзакции! Нужен ли ROLLBACK при ошибке с закрытием подключения! (autocommit=0)
    #39840949
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Воробьевво всех online-справочниках по MySQL указано, что если во время транзакции произойдет ошибка, то транзакция сама по себе не откатится и нужно делать ROLLBACK, даже при autocommit=0.
Правильно. Ошибка ЗАПРОСА не приводит к откату транзакции - хотя бы потому, что ошибка может быть ШТАТНЫМ событием транзакции.

Павел ВоробьевЗачем делать ROLLBACK и почему при возникновении ошибки во время транзакции и последующем НЕвыполнении commit в php скрипте ввиду остановки работы скрипта ROLLBACK не происходит самостоятельно?А вот в этом случае откат будет выполнен автоматически - однако не по ошибке запроса, а по причине того, что разорвано соединение, начавшее транзакцию. В отличие от ошибки запроса, после которой в транзакции продолжается выполнение действий, разрыв подключения гарантирует, что более никакие действия через него не будут выполнены. А отсутствие коммита вызывает роллбэк.

Что же до пула соединений PHP, про которые Dimitry Sibiryakov говорит, что они не разъединяются с сервером после освобождения на стороне PHP по причине остановки скрипта, то в этом случае (если Дмитрий прав) транзакция будет "висеть", пока соединение явно не завершится (скажем, соединение в пуле будет использовано для подключения к другому серверу или с другой учётной записью) или не произойдёт тайм-аут (MySQL не получит сигналов через это соединение в установленный срок). И только после завершения произойдёт роллбэк. Сколько при этом будут висеть блокировки и грязные данные - по всей видимости, рандом знает...
...
Рейтинг: 0 / 0
Транзакции! Нужен ли ROLLBACK при ошибке с закрытием подключения! (autocommit=0)
    #39840978
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovПавел ВоробьевРазрыв соединения с БД при остановке скрипта это и есть дисконнект.
Повторяю медленно: при остановке PHP скрипта соединение возвращается в глобальный пул, но не разрывается.
Только если при установлении соединения это попросите явно: https://www.php.net/manual/en/features.persistent-connections.php
Если не просили persistent - то коннект будет закрыт при завершении скрипта.
...
Рейтинг: 0 / 0
Транзакции! Нужен ли ROLLBACK при ошибке с закрытием подключения! (autocommit=0)
    #39841320
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПовторяю медленно: при остановке PHP скрипта соединение возвращается в глобальный пул, но не разрывается.

так работают только постоянные соединения, которые по умолчанию выключены.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Транзакции! Нужен ли ROLLBACK при ошибке с закрытием подключения! (autocommit=0)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]