OS 환경 : Oracle Linux 8.4 (64bit)
DB 환경 : Oracle Database 23.5.0.24.07 ai for Oracle Cloud and Engineered Systems
에러 : ORA-63302: Transaction must roll back
Priority Transactions 기능을 테스트 하던 중 발생한 에러
관련 게시글
참고 : 오라클 23ai 신기능 트랜잭션 우선순위 설정 및 자동 롤백 ( https://positivemh.tistory.com/1179 )
a 세션에서 Priority level 를 low 로 설정 후 t1 테이블 update 진행
1
2
|
SQL> alter session set txn_priority = low;
SQL> update t1 set col1 = 1111;
|
b 세션에서 Priority level 를 medium 으로 설정 후 t1 테이블 update 진행
1
2
3
|
SQL> alter session set txn_priority = medium;
SQL> update t1 set col1 = 2222;
(대기)
|
priority_txns_medium_wait_target 시간(초) 만큼 대기하다가 b 세션 update 가 성공함
a 세션에서 테스트 중이던 테이블 조회
1
2
3
4
5
6
7
|
SQL> select * from t1;
select * from t1
*
ERROR at line 1:
ORA-63302: Transaction must roll back
ORA-63300: Transaction is automatically rolled back since it is blocking a higher priority transaction from another session.
Help: https://docs.oracle.com/error-help/db/ora-63302/
|
에러가 발생함
조금 있다가 다시 쿼리하면 ORA-63302만 발생함
1
2
3
4
5
|
SQL> select * from t1;
*
ERROR at line 1:
ORA-63302: Transaction must roll back
Help: https://docs.oracle.com/error-help/db/ora-63302/
|
이때는 commit 및 dml 도 되지 않음
1
2
3
4
5
6
7
8
9
10
11
12
13
|
SQL> commit;
commit
*
ERROR at line 1:
ORA-63302: Transaction must roll back
Help: https://docs.oracle.com/error-help/db/ora-63302/
SQL> insert into t1 values (6);
insert into t1 values (6)
*
ERROR at line 1:
ORA-63302: Transaction must roll back
Help: https://docs.oracle.com/error-help/db/ora-63302/
|
이때 세션 a는 v$transaction 에서 조회되지 않음
1
2
3
|
SQL> select * from v$TRANSACTION where addr = (select taddr from v$session where sid = 298);
no rows selected
|
세션 상태는 inactive 상태임
1
2
3
4
5
6
7
8
9
10
11
|
SQL>
set lines 200 pages 1000
col username for a10
col program for a30
select sid, serial#, status, username, program
from v$session
where sid = 298;
SID SERIAL# STATUS USERNAME PROGRAM
---------- ---------- -------- ---------- ------------------------------
298 15143 INACTIVE IMSI sqlplus@ora23 (TNS V1-V3)
|
해결 방법 : 롤백 명령을 입력
롤백명령을 입력
1
2
3
|
SQL> rollback;
Rollback complete.
|
테이블 재조회
1
2
3
4
5
6
7
8
9
|
SQL> select * from t1;
COL1
----------
1
2
3
4
5
|
정상적으로 롤백된 결과가 나옴
원인 :
Priority Transactions 기능 중 일부로 우선순위가 높은 트랜잭션에 의해 자동 롤백 된 뒤에는 명시적으로 해당 세션에서 rollback 를 입력해줘야 그다음 작업들이 가능함
a세션에서 rollback 명령을 입력하지 않아도 이미 트랜잭션은 롤백이 된 상태이지만 명시적으로 작성을 해줘야함
참조 :