InnoDB - откатить все транзакции для подключения - PullRequest
1 голос
/ 21 апреля 2010

Можно ли откатить все операторы, которые были выполнены в одном потоке соединения?Вместо ROLLBACK просто возвращается последний выполненный оператор.

Ответы [ 3 ]

2 голосов
/ 21 апреля 2010

Зависит от автокоммит , который по умолчанию отключен для каждого соединения.Из MySql Manual

В InnoDB все действия пользователя происходят внутри транзакции.Если включен режим автоматической фиксации, каждый оператор SQL самостоятельно формирует одну транзакцию.По умолчанию MySQL запускает сеанс для каждого нового соединения с включенной автоматической фиксацией, поэтому MySQL выполняет коммит после каждого оператора SQL, если этот оператор не возвращал ошибку.Если инструкция возвращает ошибку, поведение фиксации или отката зависит от ошибки.См. Раздел 13.2.12, «Обработка ошибок InnoDB».

Сеанс с включенной автоматической фиксацией может выполнить транзакцию с несколькими инструкциями, начав ее с явного оператора START TRANSACTION или BEGIN и завершив оператором COMMIT или ROLLBACK.

Режим автоматической фиксации отключенв течение сеанса с SET autocommit = 0, сеанс всегда имеет открытую транзакцию.Оператор COMMIT или ROLLBACK завершает текущую транзакцию, и начинается новая.

Вы не можете выполнить откат операторов, если autocommit включен, поскольку commit неявный.

2 голосов
/ 21 апреля 2010

Помимо обычных операторов COMMIT и ROLLBACK, InnoDB поддерживает точки сохранения . Точки сохранения позволяют откатывать только несколько последних операторов в транзакции.

1 голос
/ 21 апреля 2010

вы не можете откатить вещи, которые не находятся в транзакции с самого начала - хотя с большинством БД у вас может быть режим автоматической фиксации, который делает каждую инструкцию транзакцией.

Таким образом, чтобы получить то, что вы хотите, вам нужно начать транзакцию, выполнить любую необходимую обработку, а затем выполнить откат к началу или зафиксировать.

...