2017-02-02 4 views
-1

Я создал процедуру в пакете, который делает вставку/удаление в таблице, и после успешной транзакции выполняется фиксация.Каков эффект размещения фиксации после DML в процедуре?

так:

create or replace package pac is  
procedure pr_test(emp_id number) 
is 
begin 
-- some code 
if something then 
    insert 
else 
    delete 

commit; 
end pr_test; 
end pac ; 

Должен ли я сделать эту сделку как AUTONOMOUS_TRANSACTION? Каков эффект размещения фиксации в программе?

ответ

4

Что такое эффект размещения фиксации в программе?

Oracle Documentation описывает COMMIT как:

Цель

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

Если у вас есть три PROCEDURE и каждый из них содержит COMMIT заявления, то вы не можете запустить все три, то, если исключение происходит в последней одном, ROLLBACK их всех, как изменяется от первых двух уже будут COMMIT Ted ,

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

Есть, конечно, случаи, когда вы захотите нарушить это правило, но вы должны рассмотреть каждый случай отдельно и занять время, чтобы полностью понять свою бизнес-логику, прежде чем нарушить это правило, чтобы вы знали, что такое COMMIT ted in each пример.

Должен ли я заключить сделку как AUTONOMOUS_TRANSACTION?

Один потребительная случай регистрации - вы можете иметь PROCEDURE, который вызывает другую PROCEDURE для входа действия пользователя и, независимо от того, удастся ли начальное действие или терпит неудачу вы хотите сохранить журнал действий и обеспечения того, чтобы log is COMMIT ted. В этом случае запись PROCEDURE должна быть AUTONOMOUS_TRANSACTION и содержать оператор COMMIT, и оператор вызова должен (возможно) не иметь ни того, ни другого.

Таким образом, если COMMIT одного PROCEDURE всегда требуется и не зависит от то ли вызывающий COMMIT сек другие данные делают PROCEDURE в AUTONOMOUS_TRANSACTION. Если PROCEDURE s могут быть объединены вместе, а затем ROLLBACK в качестве группы, то вы не хотите делать их AUTONOMOUS_TRANSACTION s.

-1

Я предлагаю вам обратиться к этой статье. Это прояснит ваши запросы.

AUTONOMOUS_TRANSACTION

Прагма AUTONOMOUS_TRANSACTION инструктирует компилятор обработать SQL блок PL/после прагме как автономные (независимые) от сделки вызова.

Если вы сделаете это Автономная транзакция зависит только от критериев использования. В обоих случаях должен быть размещен COMMIT.

Ниже приведен пример этого.

CREATE OR REPLACE 
PROCEDURE testav 
AS 
    PRAGMA AUTONOMOUS_TRANSACTION; --Declaring is Autonomous Transaction. 
BEGIN 
    INSERT INTO testa VALUES 
    ('1','2',sysdate 
    ); 
    commit; 
END; 

DECLARE 
    lv_num NUMBER; 
BEGIN 
    testav; -- Calling the Procedure 
    lv_num:=to_number('av'); --This will fail to parse but the procedure call will be successfull even though the calling block has failed. 
END; 

/

+1

Это ответ только для ссылок. Было бы лучше включить в ответ соответствующие пункты из связанной статьи. – MT0

+0

Кроме того, автономные транзакции легко использовать неправильно. Вы не должны рекомендовать людям использовать их, если не знаете, что у них есть соответствующий сценарий. Здесь дело не в этом. – APC

1

Зависит от того, что вы хотите сделать. Если вы хотите, чтобы процедура была отдельной транзакцией, я бы рекомендовал добавить pragma autonomous_transaction.

Ex: Первый сценарий

  1. таблица обновление 1
  2. Прагма AUTONOMOUS_TRANSACTION -> таблица обновления 2 -> фиксация
  3. Откат

таблица 2 будет поручена и таблица 1 будет откат

Ex: Второй сценарий

  1. Обновление таблицы 1
  2. таблица обновления 2 -> фиксации
  3. Откат

как таблица 1 и 2 будут поручены потому что рассматривает его как одну транзакцию

 Смежные вопросы

  • Нет связанных вопросов^_^