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

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

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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
21
0
10 274
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

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

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

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

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

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

Ответ принят как подходящий

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

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

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

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

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

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

David Aldridge 14.10.2008 02:16

Oracle называет журнал «файлом журнала повторного выполнения». Он называет сегменты отката «табличным пространством отмены». Вы знаете, что быстрее? Фиксация или откат?

S.Lott 14.10.2008 02:26

Если нет работы, то разницы почти наверняка нет. Oracle оптимизирован для быстрой фиксации - для этого требуется только запись фиксации в буфер журнала повторов и очистка буфера (за исключением асинхронной фиксации в 10g +). Откат - больше работы.

David Aldridge 15.10.2008 20:46

В asktom.oracle.com/pls/asktom/… Том Кайт указывает, что база данных фактически не будет выполнять никаких операций фиксации, если нет транзакции. Вероятно, вы могли бы проверить это, сделав несколько сотен очень быстро и проверив количество событий синхронизации файлов журнала.

Gary Myers 17.09.2009 12:00

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

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

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

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

На самом деле это зависит от клиента. sqlplus, это неявная фиксация. других может и не быть. Если сетевое соединение разорвано (например, клиент просто «уходит»), то это откат.

Matthew Watson 14.10.2008 13:14

Я не уверен, что это зависит от приложения, я, вероятно, должен был сказать «плавное отключение», но в документации говорится, что «неявный запрос возникает после нормального завершения приложения или ...» download.oracle.com/docs/cd/B28359_01/server.111/b28318/…

David Aldridge 14.10.2008 21:50

На самом деле, я нашел лучшую ссылку и отредактировал свое сообщение. Спасибо.

David Aldridge 14.10.2008 21:54

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

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

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

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

Другие вопросы по теме