Откатить последний коммит oracle

Обновлено: 07.07.2024

Как правильно использовать оператор Commit? Нужно ли использовать оператор commit для каждого оператора вставки и каждой функции? Например, если я изменяю таблицу для добавления столбца, должен ли я использовать оператор фиксации?

4 ответа

Если вы запустите оператор DDL (>, ALTER , DROP , GRANT и т. Д.) Затем:

База данных Oracle неявно фиксирует текущую транзакцию до и после каждого оператора DDL.

Если вы запустите оператор DML ( INSERT , UPDATE , DELETE , SELECT , CALL , MERGE ), то:

Эти операторы неявно фиксируют текущую транзакцию.

И вам нужно будет вручную зафиксировать незафиксированные транзакции (но вам не нужно COMMIT после каждого оператора).

Если вы хотите выполнить частичный откат, вы можете использовать SAVEPOINT с .

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

Коммиты необходимы при изменении данных в ваших таблицах (вставка, обновление и удаление). Пока вы не совершите коммит, другие пользователи не увидят измененные данные, и у вас все еще есть возможность отменить изменения, выполнив откат.

Нет необходимости фиксировать после каждого утверждения.

Коммиты не нужны при изменении самой таблицы (alter table). Фактически, оператор alter table выдает неявную фиксацию.

Основываясь на накопленном опыте и «хороших практиках», вы не должны внедрять в свои функции / процедуры утверждения «фиксация» (в большинстве случаев это зависит от задачи, чего вы пытаетесь достичь). Решение "commit" должно лежать на пользователе, который вызывает вашу функцию / процедуры. То, что вы можете реализовать, это «откат», когда возникают / обнаруживаются исключения. Часто, когда хранимые процедуры или функции вызываются из приложения / веб-части, они автоматически фиксируются (эта опция может быть изменена в методах транзакций, насколько я знаю, по крайней мере, в Java).

Вы должны четко понимать два фундаментальных термина, касающихся транзакций: фиксация (commiting) и откат (rolling back) транзакций. Ниже кратко объясняются оба термина.

Фиксация транзакции

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

  • Генерирует информацию отмены (undo), которая состоит из значений данных,подлежащих модификации, до изменений. Эти данные сохраняются в сегменте undo, расположенном в табличном пространстве undo.
  • Он также генерирует данные повторного выполнения (redo), содержащие изменения в блоках данных и в блоках отката, в буфер журнала повторного выполнения.База данных может писать на диск содержимое буферов журнала повторного выполнения перед фиксацией транзакции.
  • Проводит изменения в буферах базы данных, находящихся в SGA. База данных может писать модифицированные буферы на диск перед фиксацией транзакции.

База данных может писать изменения транзакции, которые были выполнены первыми, из буферов базы данных в SGA в файлы данных немедленно или же спустя какое-то время после фиксации транзакции, либо даже перед ее фиксацией. Когда база данных фиксирует транзакцию, она выполняет следующее.

  • База данных назначает и записывает SCN для фиксируемой транзакции.
  • Писатель журналов пишет элементы журнала повторного выполнения в файл журнала повторного выполнения на диске из буфера журнала повторного выполнения в SGA; он также записывает SCN транзакции в файл журнала повторного выполнения, помечая тем официальную фиксацию транзакции.
  • База данных освобождает все блокировки таблиц и строк.
  • База данных помечает транзакцию как завершенную.

Откат транзакции

Отменить изменения, выполненные транзакцией, которые еще не были зафиксированы, можно с помощью команды ROLLBACK. В то время как журнал повторного выполнения содержит все изменения, проведенные в транзакции, сегмент отмены (undo) содержит все старые значения, которые существовали до момента проведения изменений. Вы можете либо откатить изменения, проведенные всей транзакцией, либо просто вернуться к маркеру, который поместили ранее внутри транзакции, называемому точкой сохранения (savepoint). Существует несколько типов отката, среди которых перечисленные ниже.

Как управлять транзакциями в PL/SQL

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

Транзакция начинается неявно с первой команды SQL , выполняемой после команды COMMIT или ROLLBACK (или с начала сеанса) или же после команды ROLLBACK TO SAVEPOINT . Для управления транзакциями PL/SQL предоставляет набор команд:

  • COMMIT — сохраняет (фиксирует) все изменения, внесенные со времени выполнения последней команды COMMIT или ROLLBACK , и снимает все блокировки.
  • ROLLBACK — отменяет (откатывает) все изменения, внесенные со времени выполнения последней команды COMMIT или ROLLBACK , и снимает все блокировки.
  • ROLLBACK TO SAVEPOINT — отменяет все изменения со времени установки последней точки сохранения и снимает все блокировки, установленные в этой части кода.
  • SAVEPOINT — устанавливает точку сохранения, после чего становится возможным частичный откат транзакции.
  • SET TRANSACTION — позволяет начать сеанс чтения или чтения-записи, установить уровень изоляции или связать текущую транзакцию с заданным сегментом отката.
  • LOCK TABLE — позволяет заблокировать всю таблицу в указанном режиме. (По умол­чанию к таблице обычно применяется блокировка на уровне строк.)

Эти команды более подробно рассматриваются в следующих разделах блога.

Команда COMMIT

Фиксирует все изменения, внесенные в базу данных в ходе сеанса текущей транзакцией. После выполнения этой команды изменения становятся видимыми для других сеансов или пользователей. Синтаксис этой команды:

Ключевое слово WORK не обязательно — оно только упрощает чтение кода.

Ключевое слово COMMENT также не является обязательным; оно используется для задания комментария, который будет связан с текущей транзакцией. Текстом комментария дол­жен быть заключенный в одинарные кавычки литерал длиной до 50 символов. Обычно комментарии задаются для распределенных транзакций с целью облегчения их анализа и разрешения сомнительных транзакций в среде с двухфазовой фиксацией. Они хра­нятся в словаре данных вместе с идентификаторами транзакций.

Обратите внимание: команда COMMIT снимает все блокировки таблиц, установленные во время текущего сеанса (например, для команды SELECT FOR UPDATE ). Кроме того, она удаляет все точки сохранения, установленные после выполнения последней команды COMMIT или ROLLBACK .

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

Все команды в следующем фрагменте являются допустимыми применениями COMMIT :

Команда ROLLBACK

Команда ROLLBACK отменяет (полностью или частично) изменения, внесенные в базу данных в текущей транзакции. Для чего это может потребоваться? Например, для ис­правления ошибок:

«Нет, Нет! Я хотел удалить только те заказы, которые были сделаны до мая 2005 года!» Нет проблем — достаточно выполнить команду ROLLBACK. Что касается программиро­вания приложений, в случае возникновения проблем откат позволяет вернуться к ис­ходному состоянию.

Синтаксис команды ROLLBACK :

Существует две основные разновидности ROLLBACK : без параметров и с секцией TO, ука­зывающей, до какой точки сохранения следует произвести откат. Первая отменяет все изменения, выполненные в ходе текущей транзакции, а вторая отменяет все изменения и снимает все блокировки, установленные после заданной точки сохранения. (О том, как установить в приложении точку сохранения, рассказано в следующем разделе.) Имя точки сохранения представляет собой необъявленный идентификатор Oracle . Это не может быть литерал (заключенный в кавычки) или имя переменной.

Все команды ROLLBACK в следующем фрагменте действительны :

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

Непосредственно перед выполнением команды INSERT , UPDATE , MERGE или DELETE PL/SQL автоматически устанавливает неявную точку сохранения, и если команда завершается ошибкой, выполняется автоматический откат до этой точки. Если в дальнейшем в ходе выполнения команды DML происходит сбой, выполняется автоматический откат до этой точки. Подобным образом отменяется только последняя команда DML .

Команда SAVEPOINT

Устанавливает в транзакции именованный маркер, позволяющий в случае необходи­мости выполнить откат до отмеченной точки сохранения. При таком откате отменяются все изменения и удаляются все блокировки после этой точки, но сохраняются изменения и блокировки, предшествовавшие ей. Синтаксис команды SAVEPOINT :

Область действия точки сохранения не ограничивается блоком PL/SQL, в котором она установлена. Если в ходе транзакции имя точки сохранения используется повторно, эта точка просто «перемещается» в новую позицию, причем независимо от процедуры, функции или анонимного блока, в котором выполняется команда SAVEPOINT . Если точка сохранения устанавливается в рекурсивной программе, на самом деле на каждом уровне рекурсии она задается заново, но откат может быть возможен только к одной точке — той, что установлена последней.

Команда SET TRANSACTION

Команда SET TRANSACTION позволяет начать сеанс чтения или чтения-записи, установить уровень изоляции или связать текущую транзакцию с заданным сегментом отката. Эта команда должна быть первой командой SQL транзакции и дважды использоваться в ходе одной транзакции не может. У нее имеются четыре разновидности.

  • SET TRANSACTION READ ONLY — определяет текущую транзакцию доступной «только для чтения». В транзакциях этого типа всем запросам доступны лишь те изменения, ко­торые были зафиксированы до начала транзакции. Они применяются, в частности, в медленно формируемых отчетах со множеством запросов, благодаря чему в них часто используются строго согласованные данные.
  • SET TRANSACTION READ WRITE — определяет текущую транзакцию как операцию чтения и записи данных в таблицу.
  • SET TRANSACTION ISOLATION LEVEL SERIALIZABLE | READ COMMITTED — определяет способ выполнения транзакции, модифицирующей базу данных. С ее помощью можно за­дать один из двух уровней изоляции транзакции: SERIALIZABLE или READ COMMITTED . В первом случае команде DML , пытающейся модифицировать таблицу, которая уже изменена незафиксированной транзакцией, будет отказано в этой операции. Для выполнения этой команды в инициализационном параметре COMPATIBLE базы данных должна быть задана версия 7.3.0 и выше.При установке уровня READ COMMITED команда DML , которой требуется доступ к стро­ке, заблокированной другой транзакцией, будет ждать снятия этой блокировки.
  • SET TRANSACTION USE ROLLBACK SEGMENT имя сегмента — назначает текущей транзакции заданный сегмент отката и определяет ей доступ «только для чтения». Не может использоваться совместно с командой SET TRANSACTION READ ONLY .

Механизм сегментов отката считается устаревшим; вместо него следует использо­вать средства автоматического управления отменой, введенные в Oracle9i.

Команда LOCK TABLE

Команда блокирует всю таблицу базы данных в указанном режиме. Блокировка запре­щает или разрешает модификацию данных таблицы со стороны других транзакций на то время, пока вы с ней работаете. Синтаксис команды LOCK TABLE :

LOCK TABLE список_таблиц IN режим_блокировки MODE [NOWAIT];

Здесь список таблиц — список из одной или нескольких таблиц (локальных таблиц/пред- ставлений или доступных через удаленное подключение), а режим блокировки — один из шести режимов: ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE.

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

Примеры допустимых команд LOCK TABLE :

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

Откат отката транзакции Oracle и точка сохранения, точка сохранения и фиксация отправки

Во-первых, точка сохранения, откат

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

а, теперь мы создаем новую таблицу empt:

б) вставить первые данные;

c) установить точку сохранения sk;

г. Запрос данных;

Результаты приведены ниже:


E. Вставьте вторые данные и запрос;


е. Откат и запрос;


Когда транзакция откатывается до точки сохранения, происходят следующие события:
1. Oracle откатывает операторы только после точки сохранения.
2. Oracle сохраняет эту точку сохранения, но все созданные после нее точки сохранения теряются.
3. Oracle снимает все блокировки таблиц и строк, полученные после точки сохранения, но сохраняет все блокировки, полученные ранее.
4. Транзакция остается активной и может продолжаться.

2. Роль коммита

Впервые для операций с базами данных, сегодня я использовал оператор sql для выполнения команд удаления и обновления в Oracle. Я успешно выполнил его в локальной базе данных. Когда я сообщил о задаче боссу, я не удалял его успешно или обновлял базу данных. Смущает, почему такая несогласованность?

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

Читайте также: