Oracle откатывает транзакцию на ошибке?

ceil(log2(value))

ilog2() может быть вычислен в 3 asm инструкциях, например, http://www.asterisk.org/doxygen/1.4/log2comp_8h-source.html

8
задан OMG Ponies 23 September 2009 в 19:36
поделиться

3 ответа

«Пользовательский процесс» в этом контексте относится к процессу, запущенному на клиентском компьютере, который создает соединение с Oracle. Другими словами, если вы используете приложение A ( SQL * Plus , TOAD и т. Д.) Для подключения к Oracle, пользовательский процесс будет SQL * Plus , TOAD и т. Д. этот пользовательский процесс умирает, пока вы были в середине транзакции, эта транзакция будет отменена. Это произойдет, как только PMON обнаружит, что клиент умер, что может занять некоторое время - для Oracle не всегда тривиально отличить сбой пользовательского процесса от пользовательского процесса, который просто не выдает команды в момент.

8
ответ дан 5 December 2019 в 07:35
поделиться

это интересный вопрос!

Когда Oracle обнаруживает ошибку, он откатывает текущий оператор , а не транзакцию. Оператор - это любая инструкция верхнего уровня, это может быть оператор SQL (INSERT, UPDATE ...) или блок PL / SQL.

Это означает, что когда оператор (например, процедура pl / sql, вызываемая из java ) возвращает ошибку, Oracle переведет транзакцию в то же логическое состояние, что и до вызова. Это очень полезно, вам не нужно беспокоиться о наполовину выполненных процедурах (**).

Эта ветка на AskTom охватывает ту же тему :

[заявление] либо ВСЕГДА происходит, либо ПОЛНОСТЬЮ НЕ происходит, и Это работает следующим образом: база данных выполняет логический эквивалент:

begin
   savepoint foo;
   <<your statement>>
exception
   when others then rollback to foo; 
                    RAISE;
end;

Эта функция, на мой взгляд, является причиной того, что намного проще написать код базы данных (*) в pl / sql, чем на любом другом языке.

(*) код, который взаимодействует с Oracle DB, конечно, я полагаю, что родные процедурные языки других СУБД имеют аналогичные функции.

(**) Это касается только DML, поскольку DDL не являются транзакционными в Oracle. Также будьте осторожны с некоторыми пакетами СУБД, которые обновляют словарь данных (например, DBMS_STATS ), они часто вносят изменения, подобные DDL, и выдают коммиты. В случае сомнений обратитесь к документации .

Обновление: это поведение - одна из наиболее важных концепций в PL / SQL, я приведу небольшой пример, чтобы продемонстрировать атомарность операторов pl / sql :

SQL> CREATE TABLE T (a NUMBER);

Table created

SQL> CREATE OR REPLACE PROCEDURE p1 AS
  2  BEGIN
  3     -- this statement is successful
  4     INSERT INTO t VALUES (2);
  5     -- this statement will raise an error
  6     raise_application_error(-20001, 'foo');
  7  END p1;
  8  /

Procedure created

SQL> INSERT INTO t VALUES (1);

1 row inserted

SQL> EXEC p1;

begin p1; end;

ORA-20001: foo
ORA-06512: at "VNZ.P1", line 5
ORA-06512: at line 2

SQL> SELECT * FROM t;

         A
----------
         1

Oracle откатил транзакцию до точки непосредственно перед вызовом p1. Половина работы не делается. Это как если бы процедура p1 никогда не вызывалась.

13
ответ дан 5 December 2019 в 07:35
поделиться

Я согласен с Джастином, его понимание правильное. Добавление дополнительной информации: как разработчик приложения вы должны явно вызывать команду отката в случае возникновения ошибок. Это означает, что вам также следует рассмотреть возможность группировки операторов в транзакционные блоки, если это необходимо. Транзакционные блоки и откаты обрабатываются по-разному в разных технологиях, поэтому стоит провести некоторые исследования, чтобы убедиться, что вы хорошо это понимаете.

1
ответ дан 5 December 2019 в 07:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: