본문 바로가기

Oracle

[Oracle] ITL과 transaction의 관계 이해

728x90

ITL(Interested Transaction List)


* 개요: Transaction에 대한 이해를 위해 이 포스트에서는 Transaction 자체에 대한 설명 보다는 개별 Transaction이 Oracle Block과 어떤 식으로 관계를 맺는지에 대해서 설명할 것이다. 이것을 설명하기 위해 ITL 부터 먼저 설명하고 이후에 Transaction 자체의 구성에 대해 설명할 것이다. 
 
1.1. ITL: Transaction과 ITL의 관계 이해
 
- 오라클 Transaction의 간략한 이해
  일반적인 DML 구문 수행 시, 해당 구문이 수행되어 Row 정보를 변경하는 경우 관련 Row에 대해서는 Lock을 걸고, 이전 Row에 대한 Before 이미지에 대한 정보를 Undo Segment 또는 Rollback Segment에 저장한다는 것을 잘 알고 있을 것이다. 그러나, Lock 정보나 Before 이미지에 대한 정보가 어디에 어떤식으로 관리되는지 아는 사람은 드물 것이다. 실제 이 처리 로직은 잘 몰라도 되며, Oracle Internal 한 부분이기 때문에 문서화 되지도 않았기 때문이다.
 
- 오라클 Transaction 및 Row Level Locking 정보 관리에 대한 간략한 이해


  Transaction이 발생하여 Row의 Locking 정보가 변경되는 경우, 이러한 Row Level Lock 변경 정보 및 Transaction 정보는 Block에 기록된다. 더 정확히 말하면 Block Header내부에 Block에 발생한 Transaction 정보가 기록된다. 진행 중인 여러 Transaction에 의해 Row변경이 가해진 경우, Transaction 각각이 하나의 엔트리를 가지며 Block Header 내부에 할당된다. Block에 가해진 Transaction의 수 만큼 엔트리가 생기게 된다. 
  SCOTT 유저의 EMP 테이블을 예로 들어보자.  하나의 블록이 있고, 테이블이 작으므로 하나의 Block에 14개 Row가 모두 포함되어 있다.  여기서 SQL*PLUS 로 창을 여러개 열어 각각 다른 Row에 대해 트랜잭션 10개를 발생 시키면, Block Header 내부에는 각각 다른 Transaction 엔트리가 총 10개 생기게 된다. 이 정보는 List 형태로 관리된다. 여기서 말하는 Transaction 엔트리의 수를 통제하는 것이 INITRANS, MAXTRANS이다. 이후에 설명할 것이다.
 
- ITL(Interested Transaction List)


  블록에 발생시킨 하나의 Transaction 당 Block Header에 Transaction 엔트리들이 List의 형태로 관리된다고 이미 설명했다. Header 내부 Transaction 정보를 관리하는 List 자체를 ITL 즉, 풀어서 Interested Transaction List 라고 한다. Block Header의 ITL 내부에는 각각의 Transaction Entry들이 있으며 내부에는 Transaction 자체의 정보, Row Before 정보를 가지고 있는 Undo Segment 또는 Rollback Segment 관련 정보, Transaction 의 Commit 여부, 블록 내부에 Row Level Lock이 걸린 Row 수, Transaction 완료 시의 SCN 정보에 대한 것들을 포함하고 있다. Block 내의 Row들은 이 ITL의 하나의 Entry와 관계를 맽는다. 이 부분에 대해서는 예를 통해 자세히 설명할 것이다. 


  다음은 Block Dump를 통한 ITL 정보를 본 경우이다.

 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0005.007.0000011a  0x008012e5.00d6.24  C---    0  scn 0x0000.00081ac7
0x02   0x0012.00f.00000b38  0x02000d6f.00ab.0e  ----   14  fsc 0x0000.00000000
0x03   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000


  * ITL: ITL  내부의 하나의 Slot(즉, 엔트리) 번호이다. 트랜잭션 하나 당 하나의 ITL Slot이 생긴다. 해당 Slot은 Flag 에 따라 Commit이 되었을 수도 있고 아닐 수도 있다.


  * XID: ITL Slot과 관계를 맺은 Transaction의 XID 정보이다. V$TRANSACTION 뷰에서 XID 정보를 찾을 수 있으며, XID는 트랜잭션을 유일하게 식별해주는 값이다.


  * UBA: Transaction이 참조하고 있는 Undo 정보이다. Before 이미지가 저장된 곳을 찾을 때 이것을 참조한다.


  * FLAG: Transaction의 상태를 나타낸다. 크게 '----' 처럼 어떠한 Flag도 기록되어 있지 않으면 Transaction이 진행 중이라는 의미가 되며, 이외에는 Commit을 통해 완료된 상태로 봐도 된다.(Flag 정보와 관련하여 여러 이슈들이 존재한다. 이 부분에 대해서도 이후 세션에서 자세히 다루겠다.)


  * LCK: 해당 ITL Slot을 사용하는 Transaction이 해당 Block의 얼마나 많은 Row에 Lock을 걸었는지 나타낸다.( Commit이 된 Transaction의 ITL Slot이고 Lock을 잡은 Row가 없는 데도 불구 값이 설정된 경우가 있다. 이 부분에 대해서는 Delayed Block Cleanout 부분에서 추가로 다룰 것이다.


  * SCN/FSC: SCN이 표시 된 경우 Transaction이 Commit된 경우 그 시점의 scn 정보를 기록한다.(FSC 에 대한 부분은 이후에 설명하겠다.)


  * 위 상태는 트랜잭션이 진행 중인 상태인 Flag '----'상태와 이전의 Commit 된 Transaction 정보를 포함하는 'C---' 상태만이 Slot에 포함된 경우만 설명하였다. 그러나, 이것들 이외의 사항들이 존재하며, 이후에 관련하여 추가 설명을 하겠다.
 
  위 ITL 정보 각각을 설멍하면 다음과 같다.


1) ITL Slot 0x01: 이미 Commit된 Transaction의 Slot이다. 이전에 어떤 트랜잭션이 Slot을 사용한 후, Commit을 하였다. Flag 값은 'C---' 으로 Commit 되었다는 것을 알 수 있으며, 트랜잭션 완료 시점의 scn은 '0x0000.00081ac7' 이다. 단, Transaction의 변경된 Row에 대한 Before Image를 참조하는 Row가 있을수도 있다. 이때 UBA와 SCN 정보를 이용하여 찾는다.


2) ITL Slot 0x02; 현재 진행중인 Transaction의 Slot이다. 관련 XID 정보와 V$TRANSACTION 정보의 조합으로 진행 중인 트랜잭션의 상세사항을 알 수 있다. LCK 값이 '14' 이므로, 블록의 총 14개 Row에 대해 Lock을 걸었다는 것을 알수 있다.


3) ITL Slow 0x03: 해당 Slot에는 모든 값들이 '0' 으로 설정되어 있다. 이것이 의미하는 것은 다음의 두 가지 중 하나이다.
  첫 번째, 해당 Slot이 전혀 사용되지 않은 경우이다. INITRANS로 인해 미리 설정된 Transaction Slot이 아직 사용되지 않은 경우이다.


  두 번째, 처음으로 사용된 Slot에 대해 할당된 Transaction이 Rollback을 수행한 경우이다. 이 경우 이전에 설정된 ITL Slot정보는 전부 '0' 이므로 이 값으로 돌려 놓는 것이다. Rollback의 의미는 Row 데이터 정보 뿐만 아니라 ITL Slot 정보 또한 이전 값으로 돌려 놓는다..
  
- 실제 Transaction은 여러 Block을 변경하므로, 각각은 여러 ITL Slot과 관계를 맺을 수 있다. 관계를 맺을 수 있는 ITL은 테이블 Data Block 기준으로 보았을 때, 전체 Block 수만큼 된다. 그러나, 실제 영향을 미친 Row들에 인덱스가 있는 경우, 인덱스 Block의 ITL Slot과 연관을 맺게 된다. 그러므로, 인덱스가 많은 테이블에 대해 인덱스 컬럼에 대한 변경이 있는 경우 훨씬 많은 Block의 ITL Slot과 연관을 맺게 된다.
 
* 정리
  이번 글을 통해서는 단순히 하나의 Transaction이 Block 내부에 어떤식으로 관계를 맺는지에 대해서만 설명을 하였다. Transaction과 ITL의 추가적인 이해를 위해 '1.2. ITL: Transaction과 ITL의 관계 이해(2)'에서 설명하고, ITL과 Block 내부의 Row와 어떤식으로 Locking 정보가 관리되는 지는 '1.3. ITL: Row Level Lock과 ITL의 관계' 에서 설명하겠다.

728x90
반응형