Начать транзакцию в Oracle - откат в автокоммите - PullRequest
0 голосов
/ 21 ноября 2018

Я перехожу с SQL Server на Oracle. Я обнаружил, что в Oracle автоматическая фиксация по умолчанию отключена, но у меня вопрос: как мы можем откатить транзакцию при включенной автоматической фиксации?В SQL Server есть оператор Begin tran, а как же Oracle?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Сам Oracle не имеет автоматической фиксации, настройте инструмент и используйте начало исключения;: https://asktom.oracle.com/pls/apex/f?p=100:11:0%3A%3A%3A%3AP11_QUESTION_ID:314816776423

Пожалуйста, прочтите также - поскольку не все знают, что команды DDL принимают неявно - все, что было сделано до того, как будет принят любой оператор DDL: https://docs.oracle.com/cd/A57673_01/DOC/api/doc/PC_22/ch08.htm#toc103

0 голосов
/ 21 ноября 2018

В Oracle нет эквивалента begin tran.

Oracle неявно запускает транзакцию при первом запуске некоторого DML.Транзакция продолжается до тех пор, пока мы не выполним COMMIT или ROLLBACK.Обратите внимание, что в Oracle команды DDL выдают неявные коммиты до и после выполнения;поэтому мы можем не только откатить оператор CREATE TABLE, но и откатить любые операторы DML, которые мы выполнили до этого оператора CREATE TABLE.

Autocommit - это антишаблон в моей книге: транзакция - это единица работы, которая во всех приложениях, кроме самых тривиальных, представляет собой серию утверждений.Фиксация после каждого оператора приводит к несогласованности, неустранимости и (потенциально) повреждению данных.

Однако, чтобы ответить на вопрос: Autocommit фиксирует на уровне оператора.Таким образом, нет способа откатить одну успешно завершенную транзакцию.Следовательно, если вы хотите иметь несколько операторов DML в одной транзакции с возможностью откатить незавершенную единицу работы, вам нужно сгруппировать операторы в блок PL / SQL.

Здесь у нас есть PL / SQLблок, который вставляет несколько записей в отдельные операторы.

begin
    insert into t23 (id) values (1);
    insert into t23 (id) values (2);
    insert into t23 (id) values (3);
    insert into t23 (id) values (4);
    insert into t23 (id) values (1);
exception
    when dup_val_on_index then
        rollback;
        raise;
end;
/

Если бы мы запустили этот блок на клиенте с AUTOCOMMIT, он вставил бы ноль записей.Autocommit работает на уровне выполнения, который в данном случае является блоком: либо целое успешно выполняется и фиксируется, либо не выполняется, а это не так.Следовательно, отказ пятой вставки пройти проверку первичного ключа вызывает откат предыдущих четырех вставок.

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


Так что же означает эта опция ?: tools -preferences - database - advance - autocommit checkbox

Это путь к меню изваш клиент IDE (Oracle SQL Developer?).AUTOCOMMIT - это опция клиента, которая выдает коммит после каждого оператора, выполняемого клиентом.

...