행위

"오라클 ITL"의 두 판 사이의 차이

DB CAFE

(ITL 처리 절차)
(ITL 처리 절차)
 
23번째 줄: 23번째 줄:
 
## 예를 들어, 한 Block에 10개 row가 있다.  
 
## 예를 들어, 한 Block에 10개 row가 있다.  
 
## 각각 10개의 sqlplus를 열어서 1개씩 row를 수정하면 Block Header에 각각 다른 트랜잭션 엔트리가 생긴다.  
 
## 각각 10개의 sqlplus를 열어서 1개씩 row를 수정하면 Block Header에 각각 다른 트랜잭션 엔트리가 생긴다.  
## 이 정보는 list로 관리되고 엔트리수는 테이블의 INITRANS, MAXRANS로 통제할 수 있다.  
+
## 이 정보는 list로 관리되고 엔트리수는 [[테이블 inittrans maxtrans|테이블의 INITRANS, MAXRANS]]로 통제할 수 있다.  
 
 
  

2024년 5월 10일 (금) 16:20 기준 최신판

thumb_up 추천메뉴 바로가기


1 ITL(Interested Transaction List)[편집]

  • 데이터 블록 내에 있는 각 행에 대한 트랜잭션 정보 저장소
  •  ITL에는 해당 행을 읽거나 수정하는 트랜잭션들의 정보가 기록되어 있음
  • ITL 슬롯은 이러한 트랜잭션 정보를 담고 있는 블록 내의 영역

2 ITL 슬롯 구성 요소[편집]

  1. Transaction Slot Entry(트랜잭션 슬롯 엔트리)
     - ITL 슬롯에 트랜잭션 정보가 슬롯 당 하나씩 기록
    - 각 트랜잭션 슬롯 엔트리에 해당 트랜잭션의 정보가 기록됨
  2. Transaction ID(트랜잭션 식별자)
     - 트랜잭션 슬롯에 해당 트랜잭션을 식별하는 고유한 ID 저장됨
    - 고유 식별자는 트랜잭션을 추적하고 row에 대한 변경을 관리하는 데 사용
  3. Undo Segment Pointer(Undo 세그먼트 포인터)
     - 트랜잭션이 행을 수정할 때 발생하는 Undo 정보를 관리하기 위해 Undo 세그먼트의 포인터가 ITL 슬롯에 저장됨
    - 포인터를 사용하여 트랜잭션의 롤백이나 일관성 유지를 위해 필요한 정보를 참조 함
  4. Status Bits(상태 비트)
     - ITL 슬롯은 각 트랜잭션에 대한 상태를 나타내는 비트를 포함 하고 있음.
    - 이 비트들은 트랜잭션이 어떤 상태(읽기/쓰기 등)에 있는지를 나타냄.

3 ITL 처리 절차[편집]

  1. DML이 수행되는 경우 변경되는 Row에 Lock을 걸고, 이전 row에 대한 이미지 정보를 undo segment 에 저장(이러한 이미지 정보 관리에 ITL이 이용됨)
  2. row level locking 정보 및 발생한 트랜잭션 정보는 Block Header에 저장된다.
    1. 예를 들어, 한 Block에 10개 row가 있다.
    2. 각각 10개의 sqlplus를 열어서 1개씩 row를 수정하면 Block Header에 각각 다른 트랜잭션 엔트리가 생긴다.
    3. 이 정보는 list로 관리되고 엔트리수는 테이블의 INITRANS, MAXRANS로 통제할 수 있다.

4 트랜잭션 엔트리 정보[편집]

  1. 트랜잭션 자체 정보
  2. Undo Segment (Row Before 이미지 정보)
  3. 트랜잭션 커밋 여부
  4. 블록 내부에 row level lock이 걸린 수
  5. 트랜재션 완료 시의 SCN 정보

5 Block Dump세 ITL 정보 확인[편집]

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0016.026.00003222 0x01c0003f.0410.26 ---- 1 fsc …
0x02 0x0016.025.00003222 0x01c0003f.0410.25 C--- scn …
  • Itl : ITL의 엔트리 slot 번호
    트랜잭션 하나당 itl slot 이 생긴다.
    해당 슬롯은 flag에 따라 commit이 되었을 수도 있고 아닐수도 있다.
  • Xid : ITL Slot과 관계를 맺은 Transaction ID (XID) 정보
    v$transaction 뷰에서 XID를 찾을수 있다.
    XID는 트랜잭션을 식별 할 수있게 해준다.
  • Uba : 트랜잭션이 참조하고 있는 Undo 정보이다. *: Uba(Undo Block Address)
    UBA 는 Undo Block DBA + Seq# + Record# 로 이루어진다.
    롤백을 할 경우 이 정보들을 활용한다.
  • Flag : Transaction의 상태를 나타낸다.
    '----' 처럼 아무것도 없으면 트랜잭션이 진행중이라는 의미다.
    이외는 commit을 통해 완료된 상태로 봐도 된다.
  • Lck : 해당 ITL Slot을 사용하는 트랜잭션이 해당 Block의 얼마나 많은 row에 Lock을 걸었는지 나타낸다.
  • Scn/Fsc : Scn이 표시 되어 있는경우 Transaction이 commit 된 경우 그 시점의 scn을 기록한다.

5.1 ITL 정보 이후에 row에 대한 정보[편집]

block_row_dump: Row 데이터 정보
tab 0, row 0, @0x13cd
tl: 1009 fb: --H-FL-- lb: 0x1 cc: 2 로우에 Lock Byte 정보가 있음
col 0: [ 2] c1 02
col 1: [1000]
31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
...
tab 0, row 1, @0xfdc
tl: 1009 fb: --H-FL-- lb: 0x0 cc: 2
col 0: [ 2] c1 03
col 1: [1000]
31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
...
​
  • lb : lock byte를 의미하며 (row를 변경해서) 락을 건 ITL 번호를 말한다.
    lock byte 값은 커밋이 발생해도 바로 반영되지 않는다.
    나중에 deleyed block cleaned 가 발생하거나 다른 프로세스에 의해 정리된다.
    실제 커밋이 되었는지 여부는 언두 세그먼트 헤더의 트랜잭션 테이블을 조회해 보면 알수 있다.
    오라클은 커밋시 모든 블록의 ITL을 수정하지 않는다.
    - 변경된 블록 중 버퍼 캐시에 올라온 것 중 일부만 커밋을 처리한다.
    - 나머지 블록에 대해서는 언두 세그먼트 헤더의 트랜잭션 테이블에만 커밋 처리를 한다.
    - 다른 세션에 의해 스캔될 때, 실제 clean out 처리가 된다.이것을 deleyed clean out 이라고 한다.
  • 특정 row가 다른 트랜잭션에 의해 변경중인지는 ITL 뿐만 아니라 언두 정보까지 조회해야 한다.
  • 오라클의 로우 레벨 락은 실제 물리적인 락이 아니라 논리적으로 만들어진 락이다.
  • [ 해당 로우의 변경여부 + 로우를 변경한 트랜잭션정보(ITL) + 언두영역의 트랜잭션 테이블 슬롯 + TX 락]의 정보들이 조합된 일종의 논리적인 락이다.

6 결론[편집]

  • ITL 슬롯은 데이터 블록 내에서 행에 대한 트랜잭션 정보를 효과적으로 관리하고 동시성을 제어하는 데 사용.
  •  여러 트랜잭션이 동시에 특정 행에 접근하고 수정하는 경우, ITL을 통해 각 트랜잭션이 해당 행에 대한 권한을 관리하고, 필요한 경우 롤백이나 일관성 유지를 위한 정보를 추적할 수 있음.