Новый комментарий

iluha22 13.08.2019 в 14:16

В MySQL не существует механизма вложенных транзакций. Одно соединение с БД — одна транзакция. Новая транзакция в пределах одного соединения может начаться только после завершения предыдущей.
Или я чего-то еще не знаю!?

ivashkevich 13.08.2019 в 19:35

Всё верно

[email protected] 02.08.2020 в 19:06

Если транзакция заканчивается словом "COMMIT", то получается если один запрос выполнился, а второй нет. То изменения после первого запроса остаются в силе?

ivashkevich 03.08.2020 в 02:39

Если второй не выполнился и это ошибка, значит эту ошибку надо обработать. Скорее всего в таком случае надо выполнить rollback

[email protected] 11.12.2020 в 09:38

BEGIN;
UPDATE `users` SET `name`="Иваны" WHERE id=2;
UPDATE `users` SET `id`= id/0 WHERE id=2;
COMMIT;

Подскажите пожалуйста, почему 1й update выполняется, если во втором явная ошибка деление на ноль?
ivashkevich 13.12.2020 в 07:33

А второй не выполняется?

[email protected] 13.12.2020 в 09:32

Второй не выполняется

ivashkevich 17.12.2020 в 17:45

Не знаю на какой версии у вас ошибка, но у меня только warning появился на втором запросе, при попытке задать в поле id значение NULL. Вместо него записался 0. Оба запроса выполнились успешно в рамках транзакции.

Deo 01.01.2021 в 16:48

Я вообще сделал без COMMIT;
Просто:

BEGIN;
UPDATE `users` SET `name`="Иваны" WHERE id=2;
UPDATE `users` SET `id`= id/0 WHERE id=2;

И всё, никакого подтверждения не потребовалось, имя изменилось, а деления на ноль не произошло...

ivashkevich 04.01.2021 в 07:01

id поменялся?

Deo 04.01.2021 в 15:10

Id не поменялся.
Обнаружил, что данная ошибка не возникает при работе в phpMyAdmin,
только при работе из консоли.
В phpMyAdmin зато нет возможности сделать ROLLBACK.

ivashkevich 04.01.2021 в 20:44

Забавно)

[email protected] 16.04.2021 в 13:12

По-моему bulk операции работают по такому же принципу, если одно значение не удалось вставить, то все не будут вставлены

zick 06.11.2021 в 14:52

Гуру, подскажи почему у Ольги пол добавился,
хотя эти 2 операции в рамках 1 транзакции
(я специально допустил ошибку в имени Иван)

begin; 
update users set gender = "f" WHERE name = "Ольга"; 
update users set gender = "m" where name = "Ива"; 
commit;
ivashkevich 01.12.2021 в 04:46

Запрос выполнился успешно. Обновил при этом 0 строк, никаких ошибок не возникло.

zarin 05.01.2022 в 13:28

Если в столбце name нет строки с именем 'Ива' как запрос тогда успешно выполнится?
Причем первый запрос вносит изменения и коммитит их в таблицу даже если второй запрос обращается к несуществующему значению.

ivashkevich 19.02.2022 в 19:19

Ну вот так. Нет и нет, значит ничего обновлять не нужно. Ошибки никакой в этом нет.

Как врач крикнет в коридор: "Следующий". Следующего не окажется. Врач от этого не сломается.

zarin 22.02.2022 в 18:34

Артём, я понял вашу логику. Что транзакция обновила 0 строк и успешно выполнилась.
Может тогда на примере объясню свой вопрос. У меня есть таблица
описание картинки

Я пишу транзакцию

begin; 
update users set gender = "f" WHERE name = "Ольга"; 
update users set gender = "m" where name = "Ива"; 
commit;

При этом имя поля name для Ольги верное, а вместо Ваня я ставлю в транзакции Ива. Т.е. по идее при выполнении транзакции я не должен получить изменений в таблице, но при выполнении транзакции
описание картинки

Я получаю такой результат в таблице
описание картинки

Т.е. значение gender для Ольги изменилось, а для Ваня осталось без изменений. Почему так? Ведь обе операции в транзакции не должны выполняться если хотя бы одна операция не можнт быть выполнена.

L063n-9F 08.11.2022 в 15:49

Из документации 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: 'Ива' и никакие изменения в базу не будут записаны.

kriodezz 11.04.2022 в 08:53

Какая-то мутная и нерабочая тема, судя по коментам. И ответов никаких нет))

kriodezz 11.04.2022 в 09:09

Еще есть START TRANSACTION. Но тоже не работает. В общем какая-то дичь эти транзакции в МуСКЛ

ivashkevich 11.04.2022 в 09:51

Выполняйте в консоли, не в phpmyadmin

kriodezz 11.04.2022 в 10:26

Я PMA не пользуюсь. В основном через пхпшторм, иногда через консоль. Я думаю лучше позже вернуться к этой теме. Переключусь пока на ООП. Мне это ближе и интереснее. Да и курс отличный)))

Логические задачи с собеседований