Операции MySQL и как работает откат?

Я просто наткнулся на транзакции, и мне интересно

  • каковы плюсы и минусы его использования,
  • Как работает откат, старые значения хранятся в памяти, если больше, что происходит?

Для 1. Я понимаю, что вы должны использовать его для банковских переводов, но не лучше ли использовать его для всего?!?

Ответ 1

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

Термин для этого атомарный, т.е. изменение не может быть подразделено на любое меньшее.

Фактически, MySQL-хранилище MySQL InnoDB использует транзакции для всего, независимо от того, запрашиваете вы это или нет. Но большинство людей используют режим, называемый autocommit, где каждый оператор неявно запускает транзакцию и неявно совершает, как только заканчивается утверждение. В режиме автосохранения у вас нет возможности выбрать вариант возврата. Либо утверждение выполняется успешно, либо оно, если оно встречает ошибку, автоматически возвращается.

Если вы начинаете явную транзакцию, выполняете некоторые обновления, а затем откатываете назад, InnoDB восстанавливает исходное состояние данных. Он сохраняет исходные данные, сохраняя их в области базы данных, называемой сегментом отката. Поэтому, если вы откатываете назад, он просто повторно копирует эти страницы данных, чтобы заменить те, которые вы изменили.

Это может занять некоторое время, поэтому, если вы попытаетесь запросить данные, которые были изменены, но откат назад, InnoDB автоматически отправит обход, чтобы прочитать исходные данные из сегмента отката, до тех пор, пока он не будет повторно объединен с таблицы.

Скажите, например, что вы начинаете транзакцию, и ОБНОВЛЯЕТ миллиард строк. Это копирует множество строк исходных строк в сегмент отката, а затем заполняет таблицы измененными данными, но измененные данные не фиксируются. Никто не должен читать незафиксированные данные, поэтому каждый, кто запрашивает таблицу, автоматически получает исходные данные из сегмента отката.

Затем вы откатите свою транзакцию. Постепенно в течение следующих нескольких минут InnoDB очищает, и в конечном итоге все возвращается к синхронизации. Но каждый может продолжать запрашивать исходные данные тем временем.

Если вы совершили транзакцию, тогда MySQL просто пометит все измененные данные как зафиксированные, и каждый, кто впоследствии считывает данные, не будет испытывать небольшие издержки чтения из сегмента отката.