2012-06-18 2 views
0

sqldeveloper를 사용하여 "select * from table_name where att1 = 'some_value'for update"쿼리를 사용하여 행 잠금을 얻습니다. 그리고 SP에서 예외의 경우에는 동일한 행에서 롤백을 사용하여 잠금을 해제하려고 시도하지만 롤백은 SP에서 작동하지 않습니다. 하지만 sqldeveloper에서 롤백을하면 잘 작동하고 잠금 장치가 해제됩니다.저장 프로 시저에서 롤백이 작동하지 않습니다.

내가 잘못하고 있으면 안내해주세요. 여기 내 저장 프로 시저가 있습니다.

DECLARE 
    resource_busy EXCEPTION; 
    resource_busy2 EXCEPTION; 
    PRAGMA EXCEPTION_INIT (resource_busy, -30006); 
    PRAGMA EXCEPTION_INIT (resource_busy2, -00054); 
BEGIN 
    counter := 0; 

    SELECT COUNT (*) 
    INTO counter 
    FROM TBLACCOUNT 
    WHERE TBLACCOUNT.ACCOUNT_ID = RPAD (ACCT_NUM, 20, ' '); 

    IF (counter > 0) THEN 
    BEGIN 
     SELECT TBLACCOUNT.AVAILABLE_BALANCE, TBLACCOUNT.ACTUAL_BALANCE 
     INTO Avail_Bal, Curr_Bal 
     FROM TBLACCOUNT 
     WHERE TBLACCOUNT.ACCOUNT_ID = RPAD (ACCT_NUM, 20, ' ') 
     FOR UPDATE WAIT 1; 
    EXCEPTION 
     WHEN resource_busy OR resource_busy2 
     THEN 
     ROLLBACK;      --This rollback is not working. 
     RETURN -2; 
    END; 
    END IF; 
END; 

이 SP는 업데이트를 위해 select를 사용하여 잠금을 획득하지만 롤백을 수행하지 않을 때마다 -2를 반환합니다.

+1

캡스 락 제목! – Shackrock

+6

무엇을 롤백하려고합니까? 다른 세션에서 해당 리소스를 잠그고 있으므로 세션에서 리소스를 잠글 수 없습니다. 귀하의 '롤백'은 다른 세션이 보유하고있는 잠금을 제거 할 수 없습니다 ... –

+0

나는 'ROLLBACK' 문이 작동하고 있다고 믿습니다. 그것은 사양에 따라해야 할 모든 것을하고 있습니다. ORA-00054 예외가 발생하면 다른 세션의 충돌 잠금 때문에 세션이 행 잠금을 얻지 못했습니다. – spencer7593

답변

4

잠금을 획득 한 SQL Developer 세션과 다른 세션에서 저장 프로시 듀어를 실행하는 경우, 롤백을 발행해도 잠금이 해제되지 않습니다. SQL Developer 세션 (세션 A)은 잠금을 보유하므로 저장 프로시 듀어 (세션 B)가 실행되는 세션은 아무 영향을 미치지 않습니다. 세션 A 만 롤백을 발행하고 잠금을 해제 할 수 있습니다.

잠금을 획득 한 SQL Developer 세션과 동일한 세션에서 저장 프로시 듀어를 실행하는 경우, 현재 세션이 이미 잠금을 보유하고 있으므로 저장 프로시 듀어의 SELECT ... FOR UPDATE 문은 예외를 생성하지 않습니다. 즉, 저장 프로 시저가 EXCEPTION 블록을 입력하지 않고 ROLLBACK을 발행하지 않습니다.

관련 문제