트랜잭션을 킬하면 트랜잭션이 처리했던 데이터들을 롤백하게 됩니다. 

롤백이 끝날때까지 해당 테이블에 트랜잭션을 수행할 수 없어 무한정 기다리게 되는데 

이 롤백을 좀더 빨리 하고 완료시간을 예상해볼 수 있는 쿼리를 공유드리겠습니다.

 

-1. 트랜잭션 & 프로세스 킬

alter system kill session 'sid,seiral#' immediate; 
SELECT s.sid, s.serial#, p.spid
FROM v$process p, v$session s
WHERE p.addr = s.paddr
AND s.status='KILLED'

-OS-
kill -9 pid
=> DB상에서 트랜잭션 정리 후 spid를 찾아 OS상에서도 프로세스를 정리해줌

 

-2.  Fast Start Parallel Rollback 유도

SID-SERIAL     HashValue    Spid       Machine-Program                 COMMAND LOGON_TIME  Call(s)    EVENT

-------------- ------------ ---------- --------------------------      ------  ---------- ---------- -------------------------
[9874,46615]   0            7472078    db01-oracle@db01 (P000)  n/a     0620.20:12    000.000  db file sequential read
[245,61609]    0            61670314   db01-oracle@db01 (P059)  n/a     0620.20:12    000.000  wait for a undo record
[5681,17633]   0            35717294   db01-oracle@db01 (P035)  n/a     0620.20:12    000.000  row cache lock
[5480,33199]   0            24707536   db01-oracle@db01 (P007)  n/a     0620.20:12    000.000  wait for a undo record
[5238,20611]   0            20578538   db01-oracle@db01 (P036)  n/a     0620.20:12    000.000  wait for a undo record
[5061,59825]   0            25493528   db01-oracle@db01 (P034)  n/a     0620.20:12    000.000  wait for a undo record
[5044,17947]   0            57540908   db01-oracle@db01 (P057)  n/a     0620.20:12    000.000  wait for a undo record
.
.
.

=> db상에서 세션을 킬했을 때의 롤백은 프로세스 하나로 처리되기 때문에 롤백속도가 매우 느림
이렇게 롤백 중인 세션마저 킬했을 경우에는 오라클은 비정상종료로 인식하고 빠른 정상화를 위해 
SMON을 병렬로 활용하여 트랜잭션을 롤백함  
이것을 Fast Start Parallel Rollback 라고 함
 

-3.  롤백 상태 모니터링 쿼리

SQL> show parameter fast_start_parallel_rollback;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
fast_start_parallel_rollback         string      LOW
=> 위 파라미터 값에 따라 롤백 시 사용 될 parallel degree가 정해짐
FALSE : 사용안함  LOW : CPU_COUNT*2   HIGH : CPU_COUNT*4
 
* ALTER SYSTEM SET FAST_START_PARALLEL_ROLLBACK=HIGH;
커맨드로 동적으로 변경가능
 
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD HH24:MI:SS';

SELECT usn, state, undoblockstotal "Total", undoblocksdone "Done", 
undoblockstotal-undoblocksdone "ToDo",
DECODE(cputime,0,'unknown',SYSDATE+(((undoblockstotal-undoblocksdone) / (undoblocksdone / cputime)) / 86400)) "Finish at"  
FROM v$fast_start_transactions; 

USN   STATE      Total   Done  ToDo     Finish at
1074 RECOVERING 2756639 55180 2701459 2019/05/08 02:08:06
=> 롤백이 언제 끝날지 유추할 수 있는 쿼리
 
 
* 병렬로 롤백처리 하면 기존방식 보다 훨씬 빠르다는 장점도 있지만
프로세스가 병렬로 대량 수행되고 서버 리소스를 많이 사용하게 되어 서버에 의도치 않은 부하를 줄 수 있으니
수행하기 전 검토가 필요합니다.