BEGIN;
UPDATE foo SET bar = 3;
UPDATE bar SET thing = 5;
COMMIT;
В случае ошибки вся транзакция будет автоматически откатана. Вам действительно нужно выполнить ROLLBACK
, только если что-то в вашем приложении указывает на необходимость отката.
<ч />
Возможно обрабатывать ошибки явно в рамках процедур или составных операторов в MySQL, но я бы не рекомендовал идти по этому пути. См. Эту статью с практическими рекомендациями и документы для DECLARE HANDLER . Вам также придется найти конкретный код ошибки, который вы хотите обработать , или вы можете использовать общее условие SQLEXCEPTION
. Вы также захотите просмотреть составные операторы и , определяющие хранимые программы .
В любом случае, основываясь на документах, вы могли бы сделать что-то вроде запроса ниже, но, честно говоря, это не сделало бы ничего, кроме моего предыдущего ответа выше. Это также даст вам очень странные взгляды от любого, кто использует MySQL (включая меня).
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
START TRANSACTION;
UPDATE foo SET bar = 3;
UPDATE bar SET thing = 5;
COMMIT;
END;
<ч />
Старый ответ:
Если вы выполняете один запрос, это не имеет смысла. Просто выполните запрос; если произойдет ошибка, ничего не произойдет - ваша транзакция автоматически откатится.
Причина в том, что по умолчанию все отдельные запросы заключаются в «скрытую» транзакцию, называемую режимом «автоматической фиксации» в MySQL. Типичная альтернатива - явное использование транзакций - как только вы выполняете «BEGIN», вы начинаете транзакцию. Как только вы нажмете COMMIT или ROLLBACK, вы вернетесь в режим автоматической фиксации.
Таким образом, единственная причина использовать транзакцию в MySQL - это если вы хотите выполнить откат до определенного состояния, когда происходит ошибка (или какое-либо другое внешнее событие). В MySQL транзакция всегда прерывается, если возникает ошибка.
Наконец, можно полностью отключить это поведение, и тогда вы должны всегда использовать транзакции явно. Я полагаю, что «НАЧАЛО» подразумевается с момента вашей последней фиксации или отката, но вы должны либо УДАЛИТЬ, либо ОТКЛЮЧИТЬ любые выполненные запросы.
См. Модель транзакций InnoDB в руководстве MySQL для получения дополнительной информации.