Соотношение цена / производительность COMMIT и ROLLBACK, если в транзакции не были изменены данные - PullRequest
0 голосов
/ 24 сентября 2018

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

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

Сказав это:

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

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

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

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

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

1 Ответ

0 голосов
/ 07 октября 2018

(Предостережение: Этот ответ - обоснованное предположение, но может быть ошибочным.)

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

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

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

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

...