OS 환경 : Oracle Linux 8.4 (64bit)
DB 환경 : Oracle Database 23.5.0.24.07 ai for Oracle Cloud and Engineered Systems
방법 : 오라클 23ai 신기능 트랜잭션 우선순위 설정 및 자동 롤백
오라클 23ai 부터 트랜잭션에 priority(우선순위)를 지정해 트랜잭션간 lock 을 제어할 수 있음, 이 기능을 Priority Transactions 라고 부름
이 기능은 낮은 우선순위의 트랜잭션이 높은 우선순위의 트랜잭션이 row lock을 얻는 것을 막고 있을 때 자동으로 낮은 우선순위 트랜잭션을 롤백하는 기능임
txn_priority 파라미터를 사용하여 특정 사용자 세션에서 모든 트랜잭션에 우선순위(high, medium, low)를 할당할 수 있음
값 설명
- high : 기본 값임, high로 설정된 경우 다른 트랜잭션의 row lock을 해제하기 위해 트랜잭션을 롤백하지 않음
- medium : medium 우선순위 트랜잭션이 high 우선순위 트랜잭션이 필요로 하는 row lock을 보유하고 있고,
high 우선순위 트랜잭션이 priority_txns_high_wait_target 파라미터에 지정된 시간(초)보다 오래 기다리고 있는 경우, medium 우선순위 트랜잭션을 롤백함
- low : high 또는 medium 우선순위 트랜잭션이 필요로 하는 row lock을 low 우선순위 트랜잭션이 보유하고 있고,
해당 high 또는 medium 우선순위 트랜잭션이 priority_txns_high_wait_target 또는 priority_txns_medium_wait_target 파라미터에 지정된 시간(초)보다 오래 기다리고 있을 경우, low 우선순위 트랜잭션을 롤백함
참고로 low 우선순위 트랜잭션이 row lock을 기다리고 있는 경우, 해당 row lock을 보유하고 있는 트랜잭션의 우선순위와 상관없이 트랜잭션을 롤백하지 않음
트랜잭션의 priority(우선순위)와 최대 대기 시간을 확인하려면 v$transaction 뷰에서 txn_priority 컬럼과 priority_txns_wait_target 컬럼을 확인하면 됨
이 기능과 관련해서 priority_txns_mode 라는 파라미터도 존재하는데 이 파라미터는 rollback 또는 track 로 설정 가능함
값 설명
- rollback : 기본 값임, 위에서 설명한 내용들이 동작하려면(자동 롤백) 이 값으로 설정되어 있어야함
적용방법 : alter system set priority_txns_mode = rollback scope = both;
- track : lock 이 발생하는 경우 관련 통계 값만 증가 시킴(이 값으로 설정해서 우선순위 트랜잭션을 적용할 세션을 정할때 유용하게 사용할수 있음)
적용방법 : alter system set priority_txns_mode = track scope = both;
*그리고 이 기능은 OCI에서만 사용가능하다고함
관련 파라미터 확인
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
SQL>
set lines 200 pages 1000
col name for a50
col value for a20
col desc for a70
select p.name, p.value, p.isses_modifiable, p.description as "desc"
from v$parameter p
where p.name like '%txn%'
and p.name != 'global_txn_processes'
order by p.name;
NAME VALUE ISSES desc
-------------------------------------------------- -------------------- ----- ----------------------------------------------------------------------
priority_txns_high_wait_target 2147483647 FALSE Auto abort wait for high pri txns
priority_txns_medium_wait_target 2147483647 FALSE Auto abort wait for medium pri txns
priority_txns_mode ROLLBACK FALSE Modes for Priority Transactions feature
txn_auto_rollback_high_priority_wait_target 2147483647 FALSE Auto abort wait for high pri txns
txn_auto_rollback_medium_priority_wait_target 2147483647 FALSE Auto abort wait for medium pri txns
txn_auto_rollback_mode ROLLBACK FALSE Modes for Priority Transactions feature
txn_priority HIGH TRUE Priority of a transaction in a session
7 rows selected.
|
이중 priority_txns~ 파라미터와 txn_auto_rollback~ 파라미터들이 설명이 같을것을 확인 할 수 있음
2024년 09월 현재 docs.oracle.com priority_txns~ 파라미터만 존재함
참고 : https://docs.oracle.com/en/database/oracle/oracle-database/23/refrn/PRIORITY_TXNS_HIGH_WAIT_TARGET.html
하지만 docs.oracle.com의 일본 페이지를 보면 txn_auto_rollback~ 파라미터도 존재하는데 여기에 23ai가 아닌 23c로 작성된걸로 봐서
처음 23c 가 출시했을때는 파라미터 이름의 txn_auto_rollback~ 였다가 23ai 로 네이밍을 변경한 이후 priority_txns~ 로 변경한듯함
참고 : https://docs.oracle.com/cd/F82042_01/refrn/TXN_AUTO_ROLLBACK_HIGH_PRIORITY_WAIT_TARGET.html
관련 통계 확인
1
2
3
4
5
6
7
8
9
10
11
12
|
SQL>
set lines 200 pages 1000
select name, value
from v$sysstat
where name like '%txns rollback%' or name like '%txns track%';
NAME VALUE
---------------------------------------------------------------- ----------
txns rollback priority_txns_high_wait_target 0
txns rollback priority_txns_medium_wait_target 0
txns track mode priority_txns_high_wait_target 0
txns track mode priority_txns_medium_wait_target 0
|
이 파라미터들은 더 높은 우선순위 트랜잭션으로 인해 선행 트랜잭션이 롤백될 때마다 증가함
priority_txns_mode 를 track 로 설정한 경우에 (롤백될 시점에) txns track mode~ 통계값이 증가하고(자동 롤백 x)
priority_txns_mode 를 rollback 로 설정한 경우에 (롤백 시) txns rollback~ 통계값이 증가함(자동 롤백 o)
이 기능과 함께 기존에 있던 enq: TX - row lock contention 이벤트 외에 3개가 더 추가됨
1
2
3
4
5
6
7
8
9
10
|
SQL>
select name from v$event_name
where name like 'enq: TX - row lock%';
NAME
--------------------------------------------------
enq: TX - row lock contention
enq: TX - row lock (HIGH priority)
enq: TX - row lock (MEDIUM priority)
enq: TX - row lock (LOW priority)
|
본문에서는 각각 우선순위 high, medium, low 3개의 세션을 이용해서 row lock 을 걸어보고 이 기능이 어떻게 동작하는지 확인해봄
그리고 이때 발생하는 이벤트 및 alert log 도 함께 확인해봄
참고로 이 기능은 Free 버전에서는 사용 불가함
Free 버전에서 파라미터 설정시 에러가 발생함
1
2
3
4
5
6
7
8
|
SQL> ALTER SESSION SET "txn_priority" = "HIGH";
ERROR:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-12754: Feature 'Automatic Transaction Rollback' is disabled due to missing capability 'Database Editions'.
Help: https://docs.oracle.com/error-help/db/ora-02097/
Notes:
CLOUD: Only available in OCI
|
테스트
*본문 테스트는 pdb의 sys 계정에서 진행함
접속한 컨테이너 및 유저 확인
1
2
3
4
5
6
7
8
|
SQL> show con_name
CON_NAME
------------------------------
ORACLE23PDB1
SQL> show user
USER is "SYS"
|
ORACLE23PDB1 의 SYS 유저로 접속함
priority_txns_high_wait_target, priority_txns_medium_wait_target 파라미터 설정(초)
각각 15초를 기다린 뒤 rollback 되게끔 설정
1
2
3
4
5
6
7
|
SQL> alter system set priority_txns_high_wait_target = 15 scope = both;
System altered.
SQL> alter system set priority_txns_medium_wait_target = 15 scope = both;
System altered.
|
샘플 테이블 생성 및 샘플 데이터 삽입
1
2
3
4
5
6
7
8
9
10
11
|
SQL> create table t1(col1 number);
Table created.
SQL> insert into t1 values (1),(2),(3),(4),(5);
5 rows created.
SQL> commit;
Commit complete.
|
세션1 SID 확인
1
2
3
4
5
|
SQL> select sid from v$mystat where rownum = 1;
SID
----------
301
|
세션1 에서 low 설정
1
2
3
4
5
6
7
8
9
|
SQL> alter session set txn_priority = low;
Session altered.
SQL> show parameter txn_priority
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
txn_priority string LOW
|
세션2 SID 확인
1
2
3
4
5
|
SQL> select sid from v$mystat where rownum = 1;
SID
----------
302
|
세션2 에서 medium 설정
1
2
3
4
5
6
7
8
9
|
SQL> alter session set txn_priority = medium;
Session altered.
SQL> show parameter txn_priority
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
txn_priority string MEDIUM
|
세션3 SID 확인
1
2
3
4
5
|
SQL> select sid from v$mystat where rownum = 1;
SID
----------
303
|
세션3 에서 high 설정(기본값)
1
2
3
4
5
6
7
8
9
|
SQL> alter session set txn_priority = high;
Session altered.
SQL> show parameter txn_priority
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
txn_priority string HIGH
|
현재 SID 301이 LOW, 302가 MEDIUM, 303이 HIGH임
세션1 에서 t1 테이블의 모든 col1 를 1111 으로 update
1
2
3
|
SQL> update t1 set col1 = 1111;
5 rows updated.
|
정상적으로 update 됨(commit 은 하지 않은 상태)
세션4 에서 v$transaction 확인
1
2
3
4
5
6
7
8
9
10
|
SQL>
set lines 200 pages 1000
select b.sid, b.serial#, a.txn_priority, a.priority_txns_wait_target
from v$transaction a, v$session b
where 1=1
and b.taddr = a.addr;
SID SERIAL# TXN_PRI PRIORITY_TXNS_WAIT_TARGET
---------- ---------- ------- -------------------------
301 13540 LOW 0
|
txn_priority 가 low 인 SID 301 세션이 보임, priority_txns_wait_target 는 0으로 표시됨
세션2 에서 t1 테이블의 모든 col1 를 2222 으로 update 시도
1
2
|
SQL> update t1 set col1 = 2222;
(대기중)
|
선행 트랜잭션이 있기 때문에 lock이 걸려 대기함
15초 뒤 대기중이던 세션2 트랜잭션에서 update 완료 메세지 나옴
1
2
3
|
SQL> update t1 set col1 = 2222;
5 rows updated.
|
정상적으로 update 됨(commit 은 하지 않은 상태)
세션4 에서 v$transaction 확인
1
2
3
4
5
6
7
8
9
10
|
SQL>
set lines 200 pages 1000
select b.sid, b.serial#, a.txn_priority, a.priority_txns_wait_target
from v$transaction a, v$session b
where 1=1
and b.taddr = a.addr;
SID SERIAL# TXN_PRI PRIORITY_TXNS_WAIT_TARGET
---------- ---------- ------- -------------------------
302 9521 MEDIUM 15
|
ash 확인
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
SQL>
set lines 200 pages 1000
col wait_class for a15
col event for a50
select * from (
select
WAIT_CLASS ,
EVENT,
count(sample_time) as EST_SECS_IN_WAIT
from v$active_session_history
where sample_time between sysdate - interval '1' minute and sysdate
group by WAIT_CLASS,EVENT
order by count(sample_time) desc
)
where rownum <6;
WAIT_CLASS EVENT EST_SECS_IN_WAIT
--------------- -------------------------------------------------- ----------------
Application enq: TX - row lock (MEDIUM priority) 14
|
enq: TX - row lock (MEDIUM priority) 가 14초간 발생했다고 나옴(15초에 우선순위에 의해 해소되었기 때문)
alert log 확인
1
2
3
|
$ tail -10f /app/oracle/diag/rdbms/oracle23/oracle23/trace/alert_oracle23.log
ORACLE23PDB1(3):Transaction (sid: 301, serial: 13540, xid: 7.13.519, txn_priority: "LOW") terminated by transaction
(sid: 302, serial: 9521, xid: xid not available, txn_priority: "MEDIUM") because of the parameter "priority_txns_medium_wait_target = 15".
|
txn_priority 가 LOW 인 SID 301 세션이 txn_priority 가 MEDIUM 인 SID 302 세션에 의해 terminated 되었다고 나옴
이유까지 상세하게 알려줌(because of the parameter "priority_txns_medium_wait_target = 15)
세션1 에서 t1 테이블 조회
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-63300, ORA-63302 가 발생하며 t1 테이블이 조회되지 않음
이렇게 자동 롤백된 이후 처음 조회할때만 ORA-63300 과 ORA-63302 가 같이 발생하고 그다음부터 조회할때는 ORA-63302 에러만 발생함
이 상태에서 dml 이나 commit 명령을 실행해도 동일하게 ORA-63302 에러가 발생함
현재 여전히 세션2 에서 update 트랜잭션이 진행중인 상태임
세션2 에서 t1 테이블 조회
1
2
3
4
5
6
7
8
9
|
SQL> select * from t1;
COL1
----------
2222
2222
2222
2222
2222
|
정상적으로 update 한 내용이 조회됨
세션3 에서 t1 테이블의 모든 col1 를 3333 으로 update 시도
1
2
|
SQL> update t1 set col1 = 3333;
(대기중)
|
선행 트랜잭션이 있기 때문에 lock이 걸려 대기함
15초 뒤 대기중이던 세션3 트랜잭션에서 update 완료 메세지 나옴
1
2
3
|
SQL> update t1 set col1 = 3333;
5 rows updated.
|
정상적으로 update 됨(commit 은 하지 않은 상태)
세션4 에서 v$transaction 확인
1
2
3
4
5
6
7
8
9
10
|
SQL>
set lines 200 pages 1000
select b.sid, b.serial#, a.txn_priority, a.priority_txns_wait_target
from v$transaction a, v$session b
where 1=1
and b.taddr = a.addr;
SID SERIAL# TXN_PRI PRIORITY_TXNS_WAIT_TARGET
---------- ---------- ------- -------------------------
303 29112 HIGH 15
|
ash 확인
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
SQL>
set lines 200 pages 1000
col wait_class for a15
col event for a50
select * from (
select
WAIT_CLASS ,
EVENT,
count(sample_time) as EST_SECS_IN_WAIT
from v$active_session_history
where sample_time between sysdate - interval '1' minute and sysdate
group by WAIT_CLASS,EVENT
order by count(sample_time) desc
)
where rownum <6;
WAIT_CLASS EVENT EST_SECS_IN_WAIT
--------------- -------------------------------------------------- ----------------
Application enq: TX - row lock (HIGH priority) 14
|
enq: TX - row lock (HIGH priority) 가 14초간 발생했다고 나옴(15초에 우선순위에 의해 해소되었기 때문)
alert log 확인
1
2
3
|
$ tail -10f /app/oracle/diag/rdbms/oracle23/oracle23/trace/alert_oracle23.log
ORACLE23PDB1(3):Transaction (sid: 302, serial: 9521, xid: 4.6.481, txn_priority: "MEDIUM") terminated by transaction
(sid: 303, serial: 29112, xid: xid not available, txn_priority: "HIGH") because of the parameter "priority_txns_high_wait_target = 15".
|
txn_priority 가 MEDIUM 인 SID 302 세션이 txn_priority 가 HIGH 인 SID 303 세션에 의해 terminated 되었다고 나옴
이유까지 상세하게 알려줌(because of the parameter "priority_txns_high_wait_target = 15)
세션2 에서 t1 테이블 조회
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-63300, ORA-63302 가 발생하며 t1 테이블이 조회되지 않음
이렇게 자동 롤백된 이후 처음 조회할때만 ORA-63300 과 ORA-63302 가 같이 발생하고 그다음부터 조회할때는 ORA-63302 에러만 발생함
이 상태에서 dml 이나 commit 명령을 실행해도 동일하게 ORA-63302 에러가 발생함
현재 여전히 세션3 에서 update 트랜잭션이 진행중인 상태임
세션3 에서 t1 테이블 조회
1
2
3
4
5
6
7
8
9
|
SQL> select * from t1;
COL1
----------
3333
3333
3333
3333
3333
|
정상적으로 update 한 내용이 조회됨
현재 세션1, 세션2 에서 ORA-63302 가 발생하여 다른 명령어를 실행하지 못하는 상태임
이때 rollback 명령을 실행해주면 정상적으로 다른 명령어를 실행할 수 있음
세션1, 세션2 에서 rollback 명령 실행
1
2
3
|
SQL> rollback;
Rollback complete.
|
세션1, 세션2 에서 t1 테이블 조회
1
2
3
4
5
6
7
8
9
|
SQL> select * from t1;
COL1
----------
1
2
3
4
5
|
정상적으로 조회됨
테스트 종료를 위해 세션3 롤백
1
2
3
|
SQL> rollback;
Rollback complete.
|
참고1
테스트를 하다 신기한점을 발견함
위 테스트를 완료한 상태에서 다시한번 동일한 테스트를 하게되면 다르게 동작함(자동 롤백 이후 테이블 조회나 dml, commit 시 ORA-63300 에러가 발생하지 않음)
위 테스트 세션을 끊지 않은 상태로
세션1(low) 에서 t1 테이블의 모든 col1 를 1111 으로 update
1
2
3
|
SQL> update t1 set col1 = 1111;
5 rows updated.
|
정상적으로 update 됨(commit 은 하지 않은 상태)
세션2(medium) 에서 t1 테이블의 모든 col1 를 2222 으로 update 시도
1
2
|
SQL> update t1 set col1 = 2222;
(대기중)
|
선행 트랜잭션이 있기 때문에 lock이 걸려 대기함
15초 뒤 대기중이던 세션2 트랜잭션에서 update 완료 메세지 나옴
1
2
3
|
SQL> update t1 set col1 = 2222;
5 rows updated.
|
정상적으로 update 됨(commit 은 하지 않은 상태)
*세션 1에서 t1 테이블 조회
1
2
3
4
5
6
7
8
9
|
SQL> select * from t1;
COL1
----------
1
2
3
4
5
|
초기 테스트때와는 다르게 별다른 rollback 명령 없이 t1 테이블이 정상적으로 조회됨
ash 이벤트, v$transaction 쿼리, alert log 는 기존 테스트와 100% 동일하게 발생함
현재 여전히 세션2 에서 update 트랜잭션이 진행중인 상태임
세션2 에서 t1 테이블 조회
1
2
3
4
5
6
7
8
9
|
SQL> select * from t1;
COL1
----------
2222
2222
2222
2222
2222
|
정상적으로 update 한 내용이 조회됨
세션3(high) 에서 t1 테이블의 모든 col1 를 3333 으로 update 시도
1
2
|
SQL> update t1 set col1 = 3333;
(대기중)
|
선행 트랜잭션이 있기 때문에 lock이 걸려 대기함
15초 뒤 대기중이던 세션3 트랜잭션에서 update 완료 메세지 나옴
1
2
3
|
SQL> update t1 set col1 = 3333;
5 rows updated.
|
정상적으로 update 됨(commit 은 하지 않은 상태)
*세션 2에서 t1 테이블 조회
1
2
3
4
5
6
7
8
9
|
SQL> select * from t1;
COL1
----------
1
2
3
4
5
|
초기 테스트때와는 다르게 별다른 rollback 명령 없이 t1 테이블이 정상적으로 조회됨
ash 이벤트, v$transaction 쿼리, alert log 는 기존 테스트와 100% 동일하게 발생함
오라클 공식 블로그 내용에 따르면 기존 테스트처럼 ORA-63300 메세지가 발생하는게 정상으로 보임
하지만 실제 운영시 편리한것은 추가 테스트처럼 동작 하는것일듯함
물론 사용자가 rollback 명령을 입력해주지 않았는데 rollback이 된것이기 때문에 추후 로그를 볼떄(shell등) 혼란이 올수는 있을듯함
https://blogs.oracle.com/coretec/post/automatic-transaction-rollback-in-23c
참고2
cdb와 pdb에서 각각 Priority Transactions 기능이 동작할때 alert log 를 모니터링 한 결과 cdb, pdb 구분이 가능하게끔 pdb의 경우 앞에 pdb 이름이 붙음
1
2
3
4
5
6
7
8
|
$ tail -10f /app/oracle/diag/rdbms/oracle23/oracle23/trace/alert_oracle23.log
##cdb
Transaction (sid: 287, serial: 49437, xid: 6.32.700, txn_priority: "LOW") terminated by transaction
(sid: 38, serial: 46547, xid: xid not available, txn_priority: "MEDIUM") because of the parameter "priority_txns_medium_wait_target = 15".
##pdb
ORACLE23PDB1(3):Transaction (sid: 287, serial: 51059, xid: 1.24.515, txn_priority: "LOW") terminated by transaction
(sid: 38, serial: 3946, xid: xid not available, txn_priority: "MEDIUM") because of the parameter "priority_txns_medium_wait_target = 15".
|
결론 :
업무를 하다보면 lock이 발생해 dba가 수동으로 kill 해주는 업무를 가끔 하게됨
Priority Transactions 기능을 잘 활용하면 lock 이 발생했을때 dba 의 도움 없이 자동으로 해소되게끔 설계해줄 수 있음
그리고 자동 롤백 후의 시스템 상태와 관련된 잠재적 이슈가 있을수 있기 때문에 운영 환경에 적용전에는 검토를 충분히 해야할듯함
추가 테스트 결과처럼 기존에 한번 priority transaction 기능이 동작한 이후 두번째부터는 rollback 명령 없이도 자동 롤백이 된 상태로 추가 명령어를 사용할 수 있었음
이게 버그인지 아닌지는 추후 정식 On-Premise 23ai 버전이 나온뒤 테스트해봐야 알듯함
=> 36308463 버그라고함
참조 :
https://apex.oracle.com/pls/apex/features/r/dbfeatures/features?feature_id=1802
https://docs.oracle.com/en/database/oracle/oracle-database/23/admin/managing-transactions.html#ADMIN-GUID-8B71D725-24E9-4AE1-B9FA-BAC291923EAC
https://blogs.oracle.com/coretec/post/automatic-transaction-rollback-in-23c
https://blogs.oracle.com/database/post/new-priority-transactions-capability-oracle-database-23ai
https://docs.oracle.com/en/database/oracle/oracle-database/23/refrn/TXN_PRIORITY.html
https://docs.oracle.com/en/database/oracle/oracle-database/23/refrn/PRIORITY_TXNS_HIGH_WAIT_TARGET.html
https://docs.oracle.com/cd/F82042_01/refrn/TXN_AUTO_ROLLBACK_HIGH_PRIORITY_WAIT_TARGET.html
https://docs.oracle.com/en/error-help/db/ora-63300/?r=23ai
https://docs.oracle.com/en/error-help/db/ora-63302/?r=23ai
https://forums.oracle.com/ords/apexds/post/oracle-23ai-priority-transactions-bug-8452
https://github.com/oracle-devrel/technology-engineering/tree/main/data-platform/core-converged-db/database-23ai/priority-transactions
https://www.oracle.com/webfolder/dms/prod/docs/nsl400362736-na-ww-nl-rwnl1-nsl1-ev.html?elq_mid=257831&sh=122613262606092215182625121306162419192133&cmid=DEVT240521P00038C00003
https://tuna.tistory.com/108
'ORACLE > Admin' 카테고리의 다른 글
오라클 23ai 신기능 자동 인덱스 개선 (0) | 2024.11.21 |
---|---|
오라클 23ai 신기능 Parallel DML 에 대한 트랜잭션 제한 해제 (0) | 2024.11.18 |
오라클 19c sql 취소 기능(alter system cancel sql) (0) | 2024.11.14 |
오라클 23ai 신기능 스테이징 테이블(Staging) (0) | 2024.11.08 |
오라클 23ai 신기능 스키마 레벨 권한 부여 (0) | 2024.11.05 |