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를 반환합니다.
캡스 락 제목! – Shackrock
무엇을 롤백하려고합니까? 다른 세션에서 해당 리소스를 잠그고 있으므로 세션에서 리소스를 잠글 수 없습니다. 귀하의 '롤백'은 다른 세션이 보유하고있는 잠금을 제거 할 수 없습니다 ... –
나는 'ROLLBACK' 문이 작동하고 있다고 믿습니다. 그것은 사양에 따라해야 할 모든 것을하고 있습니다. ORA-00054 예외가 발생하면 다른 세션의 충돌 잠금 때문에 세션이 행 잠금을 얻지 못했습니다. – spencer7593