Подтвердить что ты не робот

Есть ли разница между фиксацией и откатом в транзакции только при выборе?

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

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

4b9b3361

Ответ 1

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

В Oracle есть пространство журналов и откатов. Журнал транзакций накапливает блоки, которые позже записываются авторами БД. Поскольку они являются асинхронными, почти ничего связанное с создателем БД не влияет на вашу транзакцию (если очередь заполняется, тогда вам, возможно, придется подождать.)

Даже для транзакции, основанной на запросах, я готов поспорить, что в области откат Oracle есть немного немного записей о транзакционных учетных записях. Я подозреваю, что откат требует некоторой работы над частью Oracle, прежде чем он решит, что на самом деле нет отката назад. И я думаю, что это синхронно с вашей транзакцией. Вы не можете выпускать блокировки до тех пор, пока откат не будет завершен. [Да, я знаю, что вы не используете какие-либо транзакции, но проблема блокировки - вот почему я думаю, что откат должен быть полностью выпущен, тогда все блокировки могут быть выпущены, а затем ваш откат завершен.]

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

Я также ожидаю, что, хотя фиксация может быть быстрее, различия будут незначительными. Столь незначительно, что вы, возможно, не сможете даже измерить их в бок о бок.

Ответ 2

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

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

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

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

Ответ 3

В общем случае COMMIT намного быстрее, чем ROLLBACK, но в случае, когда вы ничего не сделали, они фактически одинаковы.

Ответ 4

В документации указано, что:

  • Oracle рекомендует, чтобы вы окончательно завершили каждую транзакцию в ваших прикладных программах оператором COMMIT или ROLLBACK, включая последнюю транзакцию, перед отключением от Oracle Database. Если вы явно не совершаете транзакцию, и программа прерывается ненормально, то последняя незафиксированная транзакция автоматически откатывается. Нормальный выход из большинства утилит и инструментов Oracle приводит к фиксации текущей транзакции. Нормальный выход из программы предварительного компилятора Oracle не фиксирует транзакцию и полагается на Oracle Database для отката текущей транзакции.

http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_4010.htm#SQLRF01110

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

Ответ 5

Ну, мы должны учитывать, что SELECT возвращает в Oracle. Существует два режима. По умолчанию SELECT возвращает данные, поскольку эти данные просматривались в тот самый момент, когда выполнялся оператор SELECT (это поведение по умолчанию в режиме изоляции READ COMMITTED, транзакционный режим по умолчанию). Поэтому, если UPDATE/INSERT был выполнен после того, как был выпущен SELECT, который не будет отображаться в наборе результатов.

Это может быть проблемой, если вам нужно сравнить два набора результатов (например, дебета и кредитные стороны приложения главной книги). Для этого у нас есть второй режим. В этом режиме SELECT возвращает данные, поскольку он смотрел на момент начала текущей транзакции (поведение по умолчанию в READ ONLY и SERIALIZABLE уровнях изоляции).

Итак, по крайней мере иногда необходимо выполнить SELECT в транзакции.

Ответ 6

Поскольку вы не сделали никакого DML, я подозреваю, что не будет никакой разницы между COMMIT и ROLLBACK в Oracle. В любом случае делать нечего.

Ответ 7

Я думаю, что Commit будет более эффективным; поскольку обычно вы ожидаете совершения большинства транзакций БД; так что вы думаете, что БД оптимизируется для этого случая (в отличие от попыток быть более эффективным для отката).