Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Транзакции! Нужен ли ROLLBACK при ошибке с закрытием подключения! (autocommit=0) / 7 сообщений из 7, страница 1 из 1
22.07.2019, 22:17
    #39840234
Транзакции! Нужен ли ROLLBACK при ошибке с закрытием подключения! (autocommit=0)
Перечитал кучу документации. Вроде бы всё просто:

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

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

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

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


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