Соотношение цена / производительность COMMIT и ROLLBACK, если в транзакции не были изменены данные

0

Отказ от ответственности:

Я уже прочитал для транзакции, которая дешевле/быстрее: COMMIT или ROLLBACK? , который похож на мой вопрос, но относится к MS SQL Server и довольно старый. Кроме того, ответ меня почему-то удивил, поэтому я хотел бы знать, как ситуация с MySQL 5.7 в 2018 году.

Сказав это:

Предположим, что следующий сценарий:

  • Я использую MySQL 5.7.
  • Я отключил неявные транзакции.
  • У меня есть таблица InnoDB.
  • Я BEGIN транзакцию.
  • я SELECT... FOR UPDATE который блокирует несколько строк в таблице (в большинстве случаев одна строка).
  • Я проверяю, что строка (и) выбрана/заблокирована и приходит к выводу, что данные в порядке, и поэтому...
  • ... Я решил вообще не изменять какие-либо данные в заблокированных строках.

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

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

Может кто-нибудь, пожалуйста, скажите мне, какой из методов рекомендуется, если доля блокируемых строк всегда незначительна (например, что-то вроде 1/1e6) и, возможно, дает некоторый фон (или ссылку на какой-то фон)?

  • 1
    COMMIT и ROLLBACK делают разные вещи, если хотят получить ответ на исходный код MySQL.
Теги:
transactions
innodb

1 ответ

0

(Предостережение: этот ответ является образованным догадком, но может быть неправильным.)

Обычное использование commit/rollback - это фактически внести изменения, а затем отменить их. InnoDB оптимистичен тем, что предполагает совершение транзакции. Это максимизирует эффективность внесения изменений (вставки, обновления и т.д.), Не оптимизируя для отката. Следовательно, ROLLBACK больше (иногда "намного больше") дорого, чем COMMIT. Материал для потенциального отката сохраняется в журнале отмены, который в конечном итоге нуждается в очистке. Но эта очистка выполняется "позже", а не пока пользователь ждет завершения COMMIT.

Ваше использование не предполагает каких-либо фактических изменений, поэтому я бы предположил, что производительность аналогична. Я бы, вероятно, выполнил ROLLBACK чтобы дать понять будущим читателям (включая вас самих), что "ничего не сделано".

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

Ваша ссылка относится к SQL Server, который, вероятно, имеет разные алгоритмы.

  • 0
    ОК, спасибо, принято и +1. Я еще не решил, буду ли я выполнять откат или коммит, но хорошо знать, что, вероятно, он будет примерно таким же с точки зрения производительности. Ссылка, которую я дал, была только для того, чтобы доказать, что я провел собственное исследование, прежде чем спрашивать :-) Я подозревал, что сервер MySQL и сервер MS SQL будут вести себя по-разному, что было одной из причин для публикации вопроса.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню