Транзакции MySQL и как работает откат?

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

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

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

1 ответов


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

на срок атомные, т. е. изменение не может быть разделено на меньшие.

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

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

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

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

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

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