Отказ от ответственности:
Я уже прочитал для транзакции, которая дешевле/быстрее: COMMIT или ROLLBACK? , который похож на мой вопрос, но относится к MS SQL Server и довольно старый. Кроме того, ответ меня почему-то удивил, поэтому я хотел бы знать, как ситуация с MySQL 5.7 в 2018 году.
Сказав это:
Предположим, что следующий сценарий:
BEGIN
транзакцию.SELECT... FOR UPDATE
который блокирует несколько строк в таблице (в большинстве случаев одна строка). Теперь я хочу закончить транзакцию. Я мог бы сделать это либо обычным способом, то есть, выпустив COMMIT
, который в этом случае просто удалит блокировки, или, в качестве альтернативы, выпустив ROLLBACK
, который в этом случае также просто удалит блокировки.
Результат двух методов будет таким же, но я чувствую, что может быть большая разница в отношении стоимости/производительности.
Может кто-нибудь, пожалуйста, скажите мне, какой из методов рекомендуется, если доля блокируемых строк всегда незначительна (например, что-то вроде 1/1e6) и, возможно, дает некоторый фон (или ссылку на какой-то фон)?
(Предостережение: этот ответ является образованным догадком, но может быть неправильным.)
Обычное использование commit/rollback - это фактически внести изменения, а затем отменить их. InnoDB оптимистичен тем, что предполагает совершение транзакции. Это максимизирует эффективность внесения изменений (вставки, обновления и т.д.), Не оптимизируя для отката. Следовательно, ROLLBACK
больше (иногда "намного больше") дорого, чем COMMIT
. Материал для потенциального отката сохраняется в журнале отмены, который в конечном итоге нуждается в очистке. Но эта очистка выполняется "позже", а не пока пользователь ждет завершения COMMIT
.
Ваше использование не предполагает каких-либо фактических изменений, поэтому я бы предположил, что производительность аналогична. Я бы, вероятно, выполнил ROLLBACK
чтобы дать понять будущим читателям (включая вас самих), что "ничего не сделано".
Поскольку неуклюжая часть материала отмены - это старые копии строк, и вы не создаете случай, я вижу небольшую разницу.
Ваша ссылка относится к SQL Server, который, вероятно, имеет разные алгоритмы.