ceil(log2(value))
ilog2()
может быть вычислен в 3 asm инструкциях, например, http://www.asterisk.org/doxygen/1.4/log2comp_8h-source.html
«Пользовательский процесс» в этом контексте относится к процессу, запущенному на клиентском компьютере, который создает соединение с Oracle. Другими словами, если вы используете приложение A ( SQL * Plus
, TOAD и т. Д.) Для подключения к Oracle, пользовательский процесс будет SQL * Plus
, TOAD и т. Д. этот пользовательский процесс умирает, пока вы были в середине транзакции, эта транзакция будет отменена. Это произойдет, как только PMON обнаружит, что клиент умер, что может занять некоторое время - для Oracle не всегда тривиально отличить сбой пользовательского процесса от пользовательского процесса, который просто не выдает команды в момент.
это интересный вопрос!
Когда 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 никогда не вызывалась.
Я согласен с Джастином, его понимание правильное. Добавление дополнительной информации: как разработчик приложения вы должны явно вызывать команду отката в случае возникновения ошибок. Это означает, что вам также следует рассмотреть возможность группировки операторов в транзакционные блоки, если это необходимо. Транзакционные блоки и откаты обрабатываются по-разному в разных технологиях, поэтому стоит провести некоторые исследования, чтобы убедиться, что вы хорошо это понимаете.