В MySQL не существует механизма вложенных транзакций. Одно соединение с БД — одна транзакция. Новая транзакция в пределах одного соединения может начаться только после завершения предыдущей.
Или я чего-то еще не знаю!?
Если транзакция заканчивается словом "COMMIT", то получается если один запрос выполнился, а второй нет. То изменения после первого запроса остаются в силе?
BEGIN;
UPDATE `users` SET `name`="Иваны" WHERE id=2;
UPDATE `users` SET `id`= id/0 WHERE id=2;
COMMIT;
Подскажите пожалуйста, почему 1й update выполняется, если во втором явная ошибка деление на ноль?
Не знаю на какой версии у вас ошибка, но у меня только warning появился на втором запросе, при попытке задать в поле id значение NULL. Вместо него записался 0. Оба запроса выполнились успешно в рамках транзакции.
Id не поменялся.
Обнаружил, что данная ошибка не возникает при работе в phpMyAdmin,
только при работе из консоли.
В phpMyAdmin зато нет возможности сделать ROLLBACK.
Если в столбце name нет строки с именем 'Ива' как запрос тогда успешно выполнится?
Причем первый запрос вносит изменения и коммитит их в таблицу даже если второй запрос обращается к несуществующему значению.
Артём, я понял вашу логику. Что транзакция обновила 0 строк и успешно выполнилась.
Может тогда на примере объясню свой вопрос. У меня есть таблица
Я пишу транзакцию
begin;
update users set gender = "f" WHERE name = "Ольга";
update users set gender = "m" where name = "Ива";
commit;
При этом имя поля name для Ольги верное, а вместо Ваня я ставлю в транзакции Ива. Т.е. по идее при выполнении транзакции я не должен получить изменений в таблице, но при выполнении транзакции
Я получаю такой результат в таблице
Т.е. значение gender для Ольги изменилось, а для Ваня осталось без изменений. Почему так? Ведь обе операции в транзакции не должны выполняться если хотя бы одна операция не можнт быть выполнена.
Из документации mysql сделал вывод, что команда update users set gender = "m" where name = "Ива"; для транзакции является выполняемой, просто в данном случае нечего изменять.
И дело не в среде выполнения транзации - через myphp или консоль.
Транзакция с окончанием COMMIT; не внесет никаких изменений в базу, если в ходе выполнения какой-либо части команды возникнет ошибка или какая-то другая причина по которой не возможно будет выполнить команду в транзакции.
Если написать транзакцию вот так: begin; update users set gender = "f" WHERE name = "Ольга"; update users set gender = "m" where name = "Ива"/0; commit; то тогда появится ошибка ERROR 1292 (22007): Truncated incorrect DOUBLE value: 'Ива' и никакие изменения в базу не будут записаны.
Я PMA не пользуюсь. В основном через пхпшторм, иногда через консоль. Я думаю лучше позже вернуться к этой теме. Переключусь пока на ООП. Мне это ближе и интереснее. Да и курс отличный)))
В MySQL не существует механизма вложенных транзакций. Одно соединение с БД — одна транзакция. Новая транзакция в пределах одного соединения может начаться только после завершения предыдущей.
Или я чего-то еще не знаю!?
Всё верно
Если транзакция заканчивается словом "COMMIT", то получается если один запрос выполнился, а второй нет. То изменения после первого запроса остаются в силе?
Если второй не выполнился и это ошибка, значит эту ошибку надо обработать. Скорее всего в таком случае надо выполнить rollback
А второй не выполняется?
Второй не выполняется
Не знаю на какой версии у вас ошибка, но у меня только warning появился на втором запросе, при попытке задать в поле id значение NULL. Вместо него записался 0. Оба запроса выполнились успешно в рамках транзакции.
Я вообще сделал без COMMIT;
Просто:
И всё, никакого подтверждения не потребовалось, имя изменилось, а деления на ноль не произошло...
id поменялся?
Id не поменялся.
Обнаружил, что данная ошибка не возникает при работе в phpMyAdmin,
только при работе из консоли.
В phpMyAdmin зато нет возможности сделать ROLLBACK.
Забавно)
По-моему bulk операции работают по такому же принципу, если одно значение не удалось вставить, то все не будут вставлены
Гуру, подскажи почему у Ольги пол добавился,
хотя эти 2 операции в рамках 1 транзакции
(я специально допустил ошибку в имени Иван)
Запрос выполнился успешно. Обновил при этом 0 строк, никаких ошибок не возникло.
Если в столбце name нет строки с именем 'Ива' как запрос тогда успешно выполнится?
Причем первый запрос вносит изменения и коммитит их в таблицу даже если второй запрос обращается к несуществующему значению.
Ну вот так. Нет и нет, значит ничего обновлять не нужно. Ошибки никакой в этом нет.
Как врач крикнет в коридор: "Следующий". Следующего не окажется. Врач от этого не сломается.
Артём, я понял вашу логику. Что транзакция обновила 0 строк и успешно выполнилась.
Может тогда на примере объясню свой вопрос. У меня есть таблица
Я пишу транзакцию
При этом имя поля name для Ольги верное, а вместо Ваня я ставлю в транзакции Ива. Т.е. по идее при выполнении транзакции я не должен получить изменений в таблице, но при выполнении транзакции
Я получаю такой результат в таблице
Т.е. значение gender для Ольги изменилось, а для Ваня осталось без изменений. Почему так? Ведь обе операции в транзакции не должны выполняться если хотя бы одна операция не можнт быть выполнена.
Из документации mysql сделал вывод, что команда
update users set gender = "m" where name = "Ива";
для транзакции является выполняемой, просто в данном случае нечего изменять.И дело не в среде выполнения транзации - через myphp или консоль.
Транзакция с окончанием COMMIT; не внесет никаких изменений в базу, если в ходе выполнения какой-либо части команды возникнет ошибка или какая-то другая причина по которой не возможно будет выполнить команду в транзакции.
Если написать транзакцию вот так:
begin; update users set gender = "f" WHERE name = "Ольга"; update users set gender = "m" where name = "Ива"/0; commit;
то тогда появится ошибкаERROR 1292 (22007): Truncated incorrect DOUBLE value: 'Ива'
и никакие изменения в базу не будут записаны.Какая-то мутная и нерабочая тема, судя по коментам. И ответов никаких нет))
Еще есть START TRANSACTION. Но тоже не работает. В общем какая-то дичь эти транзакции в МуСКЛ
Выполняйте в консоли, не в phpmyadmin
Я PMA не пользуюсь. В основном через пхпшторм, иногда через консоль. Я думаю лучше позже вернуться к этой теме. Переключусь пока на ООП. Мне это ближе и интереснее. Да и курс отличный)))