SlideShare a Scribd company logo
1 of 16
Download to read offline
WareValley
http://www.WareValley.com
WareValley
Oracle TX Lock
오렌지팀 윤석준 선임연구원
TX Lock : 무결성 제약 위배 가능성
 Row Lock 경합은 UPDATE, DELETE 시에만 발생
 But, Unique Index가 정의되어 있을 경우에는 INSERT 에서도 발생 할 수 있음 (사례1)
 FK 로 연결된 Table에서 INSERT 할 경우에도 발생 할 수 있음 (사례2)
 Bitmap index인 경우 1개의 엔트리에 여러 레코드가 있으므로 자주 발생
1. TX1에서 dept 테이블에 deptno = 40 인 레코드 입력
2. TX2도 deptno = 40을 입력하면, Shared 모드로
enq:TX – row lock contention 대기 이벤트 발생
3. TX1이 commit 하면 TX2는 ora-00001 (무결성 제약
조건 (PK_DEPT)에 위배)
4. TX1이 rollback 하면 TX2는 정상적으로 입력 완료
 사례 1
1. TX1에서 dept 테이블에 deptno = 40 인 레코드 삭제
2. TX2에서 deptno = 40인 레코드 입력하면, Shared 모
드로 enq:TX – row lock contention 대기 이벤트 발생
3. TX1이 commit 하면 TX2는 ora-02291 (무결성 제약
조건 (FK_EMP_DEPT)에 위배)
4. TX1이 rollback 하면 TX2는 정상적으로 입력 완료
 사례 2
 Block에 레코드 추가/갱신/삭제 할 때 ITL 슬롯을 할당받고, TX ID를 기록해야 함
- 하지만, 비어있는 ITL slot이 없다면 ? Shared 모드 enq: TX – allocate ITL entry 대기 이벤트 발생
- ITL slot 하나당 24 bytes 공간필요
- ITL slot 개수는 INITRANS 로 설정 (9i부터는 3 이하로 설정 불가)
CREATE TABLE T ( … ) INITRANS 5 MAXTRANS 255 PCTFREE 30;
- PCTFREE : UPDATE를 위해 예약된 공간, 하지만 ITL slot이 부족할 경우 활용 가능
- MAXTRANS : 최대 생성 가능한 ITL slot 개수 (10g부터는 255로 고정)
 9i부터는 Table에 INSERT시 ITL 경합 없음. Index에 INSERT 할 땐 발생
TX Lock : ITL slot 부족
 ITL 경합이 자주 발생 하는 segment는 확인하여 INITRANS를 늘려주어야 함
- 하지만, 새로 할당되는 Block만 적용.
- 기존 Block을 수정하려면 해당 Table 이나 Index 전체를 재생성 해야 함
TX Lock : ITL slot 부족 (계속)
ALTER TABLE scott.dept MOVE INITRANS 5; -- INDEX가 모두 unusable 됨
ALTER INDEX scott.PK_DEPT REBUILD INITRANS 5;
 2-Phase commit을 위한 PREPARED TX Lock에 대하여
shared 모드 enq:TX – contention 대기 이벤트가 발생 할 수 있음
 Tablespace를 read-only로 전환 할 때도 발생 할 수 있음
TX Lock : 기타 Lock 발생
ALTER TABLESPACE TB_SPACE READ ONLY;
 Oracle에서는 Row-level Lock 과 TX Lock을 조합
- Row-level Lock : Block header ITL과 Row header Lock Byte 설정
- TX-Lock : Enqueue 리소스를 통해 TX Lock을 설정
 SELECT 작업에 대해서는 절대 Lock에 의한 대기 이벤트가 발생하지 않음
- 단, SELECT FOR UPDATE는 예외
- 분산 Transaction도 예외
 같은 Row에 대한 DML , DDL 작업에 대해서는 Exclusive 모드의
enq:TX – row lock contention 대기 이벤트가 발생
TX Lock : DML Row Lock
 Row-level Lock 획득시 Table Lock도 동시에 획득
- Table 구조를 변경하지 못하도록 막는 것이지, 액세스 자체를 막는 것은 아님
- TX-Lock : Enqueue 리소스를 통해 TX Lock을 설정
 LOCK TABLE 명령어를 이용하여 명시적으로 설정 가능
TX Lock : DML Table Lock
LOCK TABLE emp IN ROW SHARE MODE
ROW EXCLUSIVE MODE
SHARE MODE
SHARE ROW EXCLUSIVE MODE
EXCLUSIVE MODE
 Table Lock Mode 간의 호환성
- 선행 TX와 호환되지 않는 Mode인 경우 후행 TX는 대기하거나 작업을 포기해야 함
- INSERT, UPDATE, DELETE, MERGE : RX Lock
- SELECT FOR UPDATE : RS Lock
 Table Lock은 Enqueue로 구현 (TM Enqueue를 이용하므로 TM Lock이라 부름)
TX Lock : DML Table Lock (계속)
RS RX S SRX X
RS O O O O
RX O O
S O O
SRX O
X
• TYPE : TM
• ID1 : Object ID
• ID2 : 0
 예제에서 사용할 Lock 모니터용 Script
TX Lock : DML Table Lock (예제)
SELECT L.SESSION_ID SID,
DECODE(LOCK_TYPE,'Transaction','TX','DML','TM') TYPE,
MODE_HELD,
MODE_REQUESTED MODE_REQD,
DECODE(LOCK_TYPE,'Transaction',TO_CHAR(TRUNC(LOCK_ID1/POWER(2,16))),
'DML', (SELECT OBJECT_NAME FROM DBA_OBJECTS WHERE OBJECT_ID = L.LOCK_ID1)) "USN/TABLE",
DECODE(LOCK_TYPE,'Transaction',BITAND(LOCK_ID1, TO_NUMBER('ffff','xxxx')) + 0) SLOT,
DECODE(LOCK_TYPE,'Transaction',TO_NUMBER(LOCK_ID2)) SQN,
DECODE(BLOCKING_OTHERS,'Blocking','<<<<<') Blocking
FROM DBA_LOCK L
WHERE LOCK_TYPE IN ('Transaction', 'DML')
ORDER BY SESSION_ID, LOCK_TYPE, LOCK_ID1, LOCK_ID2
 예제에서 사용한 Orange 의 모니터링 Tool : Lock Monitor
1. SID 14 : TM Lock X Mode 수행
TX Lock : DML Table Lock (예제)
INSERT /*+ append */ INTO SCOTT.EMP_R SELECT * FROM SCOTT.EMP;
 Script
 Lock Monitor
2. SID 132 : 해당 Table에 UPDATE 시도 -> Lock 발생
TX Lock : DML Table Lock (예제)
 Script
 Lock Monitor
UPDATE SCOTT.EMP_R SET SAL = SAL + 1 WHERE EMPNO = 7369;
 v$session_wait
3. SID 14 : commit
TX Lock : DML Table Lock (예제)
 Script
 Lock Monitor
4. SID 14 : RX Lock이 걸려있는 Row에 INSERT 시도 -> Lock 발생
TX Lock : DML Table Lock (예제)
 Script
 Lock Monitor
UPDATE SCOTT.EMP_R SET SAL = SAL + 1 WHERE EMPNO = 7369;
Lock에 대한 대처법
 3가지 옵션중 선택이 가능
1. 기다린다 : SELECT ... FOR UPDATE
(default option)
2. 조금만 기다린다 : SELECT ... FOR UPDATE WAIT 3
ORA-30006 : resource busy; acquire with WAIT timeout expired
3. 안 기다린다 : SELECT ... FOR UPDATE NOWAIT
ORA-00054 : resource busy and acquire with NOWAIT specified
Lock을 푸는 방법, Commit
 Blocking : 그냥 Lock을 기다리는 거
 Deadlock : 두 세션이 Lock을 설정한 뒤 서로의 Lock을 기다리는 거
 Oracle은 Deadlock을 인지하여 해당 문장만 rollback 시킴
ORA-00060 : deadlock detected while waiting for resource
 위 메시지를 받은 세션은 commit 또는 rollback 한 후 진행해야 함
비동기식 Commit
 10gR2 부터 지원
 사용법
COMMIT WRITE [ IMMEDIATE | BATCH ] [ WAIT | NOWAIT ] ;
- WAIT (default) : LGWR가 로그버퍼를 파일에 기록했다는 완료 메시지를 받을 때까지 대기
(log file sync 대기 이벤트 발생)
- NOWAIT : LGWR의 완료 메시지를 기다리지 않고 바로 다음 트랜잭션 진행
- IMMEDIATE (default) : commit 명령을 받을 때마다 LGWR가 로그 버퍼를 파일에 기록
- BATCH : 세션 내부에 트랜잭션 데이터를 일정량 버퍼링 했다가 일괄 처리
 default인 IMMEDIATE WAIT는 안전하게 저장되는 것이 보장됨
(나머지는 정상적으로 완료되지 않을 수 있음)

More Related Content

What's hot

What's hot (20)

Connection Pooling in PostgreSQL using pgbouncer
Connection Pooling in PostgreSQL using pgbouncer Connection Pooling in PostgreSQL using pgbouncer
Connection Pooling in PostgreSQL using pgbouncer
 
APPLIED DATABASE III - Modul Data Preprocessing
APPLIED DATABASE III - Modul Data PreprocessingAPPLIED DATABASE III - Modul Data Preprocessing
APPLIED DATABASE III - Modul Data Preprocessing
 
PostgreSQL na EXT4, XFS, BTRFS a ZFS / FOSDEM PgDay 2016
PostgreSQL na EXT4, XFS, BTRFS a ZFS / FOSDEM PgDay 2016PostgreSQL na EXT4, XFS, BTRFS a ZFS / FOSDEM PgDay 2016
PostgreSQL na EXT4, XFS, BTRFS a ZFS / FOSDEM PgDay 2016
 
Arsitektur Sistem Basis Data
Arsitektur Sistem Basis DataArsitektur Sistem Basis Data
Arsitektur Sistem Basis Data
 
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
 
PostgreSQL Replication High Availability Methods
PostgreSQL Replication High Availability MethodsPostgreSQL Replication High Availability Methods
PostgreSQL Replication High Availability Methods
 
Implementation of c string functions
Implementation of c string functionsImplementation of c string functions
Implementation of c string functions
 
Flexible Indexing with Postgres
Flexible Indexing with PostgresFlexible Indexing with Postgres
Flexible Indexing with Postgres
 
What you need to know for postgresql operation
What you need to know for postgresql operationWhat you need to know for postgresql operation
What you need to know for postgresql operation
 
Algoritma dan Flowchart1.ppt
Algoritma dan Flowchart1.pptAlgoritma dan Flowchart1.ppt
Algoritma dan Flowchart1.ppt
 
Deep dive to PostgreSQL Indexes
Deep dive to PostgreSQL IndexesDeep dive to PostgreSQL Indexes
Deep dive to PostgreSQL Indexes
 
[Pgday.Seoul 2017] 3. PostgreSQL WAL Buffers, Clog Buffers Deep Dive - 이근오
[Pgday.Seoul 2017] 3. PostgreSQL WAL Buffers, Clog Buffers Deep Dive - 이근오[Pgday.Seoul 2017] 3. PostgreSQL WAL Buffers, Clog Buffers Deep Dive - 이근오
[Pgday.Seoul 2017] 3. PostgreSQL WAL Buffers, Clog Buffers Deep Dive - 이근오
 
Advanced MySQL Query Tuning
Advanced MySQL Query TuningAdvanced MySQL Query Tuning
Advanced MySQL Query Tuning
 
PostgreSQL Deep Internal
PostgreSQL Deep InternalPostgreSQL Deep Internal
PostgreSQL Deep Internal
 
Advanced pg_stat_statements: Filtering, Regression Testing & more
Advanced pg_stat_statements: Filtering, Regression Testing & moreAdvanced pg_stat_statements: Filtering, Regression Testing & more
Advanced pg_stat_statements: Filtering, Regression Testing & more
 
Sorting Alpha Numeric Data in MySQL
Sorting Alpha Numeric Data in MySQLSorting Alpha Numeric Data in MySQL
Sorting Alpha Numeric Data in MySQL
 
More mastering the art of indexing
More mastering the art of indexingMore mastering the art of indexing
More mastering the art of indexing
 
Demystifying MySQL Replication Crash Safety
Demystifying MySQL Replication Crash SafetyDemystifying MySQL Replication Crash Safety
Demystifying MySQL Replication Crash Safety
 
Data structures and algorithms made easy java
Data structures and algorithms made easy   javaData structures and algorithms made easy   java
Data structures and algorithms made easy java
 
Kd4 fungsi fungsi agregasi
Kd4 fungsi fungsi agregasiKd4 fungsi fungsi agregasi
Kd4 fungsi fungsi agregasi
 

Viewers also liked

제 5회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 5회 엑셈 수요 세미나 자료 연구컨텐츠팀제 5회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 5회 엑셈 수요 세미나 자료 연구컨텐츠팀
EXEM
 
7급 공무원도 쉽게 따라하는 쉘 스크립트
7급 공무원도 쉽게 따라하는 쉘 스크립트7급 공무원도 쉽게 따라하는 쉘 스크립트
7급 공무원도 쉽게 따라하는 쉘 스크립트
Young-Ho Cha
 
H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략
H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략
H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략
KTH
 

Viewers also liked (20)

[2015 05-29] Oracle Lock
[2015 05-29] Oracle Lock[2015 05-29] Oracle Lock
[2015 05-29] Oracle Lock
 
[2015-05-22] Oracle Ways of Concurrency Control
[2015-05-22] Oracle Ways of Concurrency Control[2015-05-22] Oracle Ways of Concurrency Control
[2015-05-22] Oracle Ways of Concurrency Control
 
Oracle History #9
Oracle History #9Oracle History #9
Oracle History #9
 
MariaDB Other Features
MariaDB Other FeaturesMariaDB Other Features
MariaDB Other Features
 
[2015-07-10-윤석준] Oracle 성능 관리 & v$sysstat
[2015-07-10-윤석준] Oracle 성능 관리 & v$sysstat[2015-07-10-윤석준] Oracle 성능 관리 & v$sysstat
[2015-07-10-윤석준] Oracle 성능 관리 & v$sysstat
 
MariaDB
MariaDBMariaDB
MariaDB
 
MariaDB Optimization
MariaDB OptimizationMariaDB Optimization
MariaDB Optimization
 
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 미리보기
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 미리보기『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 미리보기
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 미리보기
 
제 5회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 5회 엑셈 수요 세미나 자료 연구컨텐츠팀제 5회 엑셈 수요 세미나 자료 연구컨텐츠팀
제 5회 엑셈 수요 세미나 자료 연구컨텐츠팀
 
7급 공무원도 쉽게 따라하는 쉘 스크립트
7급 공무원도 쉽게 따라하는 쉘 스크립트7급 공무원도 쉽게 따라하는 쉘 스크립트
7급 공무원도 쉽게 따라하는 쉘 스크립트
 
간단한 쉘 스크립트 작성하기
간단한 쉘 스크립트 작성하기간단한 쉘 스크립트 작성하기
간단한 쉘 스크립트 작성하기
 
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 구성 지도
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 구성 지도『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 구성 지도
『프로젝트 성패를 결정짓는 데이터 모델링 이야기』 - 구성 지도
 
H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략
H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략
H3 2011 대형사이트 구축을 위한 MySQL 튜닝전략
 
개발자도 알아야 하는 DBMS튜닝
개발자도 알아야 하는 DBMS튜닝개발자도 알아야 하는 DBMS튜닝
개발자도 알아야 하는 DBMS튜닝
 
조대협의 서버 사이드 - 대용량 아키텍처와 성능튜닝
조대협의 서버 사이드 - 대용량 아키텍처와 성능튜닝조대협의 서버 사이드 - 대용량 아키텍처와 성능튜닝
조대협의 서버 사이드 - 대용량 아키텍처와 성능튜닝
 
MySQL 기초
MySQL 기초MySQL 기초
MySQL 기초
 
(추천오라클힌트교육)해시조인, Hash join, use_hash, ordered
(추천오라클힌트교육)해시조인, Hash join, use_hash, ordered(추천오라클힌트교육)해시조인, Hash join, use_hash, ordered
(추천오라클힌트교육)해시조인, Hash join, use_hash, ordered
 
성능 좋은 SQL 작성법
성능 좋은 SQL 작성법성능 좋은 SQL 작성법
성능 좋은 SQL 작성법
 
IT는 왜 인문학을 요구하는가? | 최진기 오마이스쿨 대표
IT는 왜 인문학을 요구하는가? | 최진기 오마이스쿨 대표IT는 왜 인문학을 요구하는가? | 최진기 오마이스쿨 대표
IT는 왜 인문학을 요구하는가? | 최진기 오마이스쿨 대표
 
[오픈소스컨설팅]MySQL Monitoring
[오픈소스컨설팅]MySQL Monitoring[오픈소스컨설팅]MySQL Monitoring
[오픈소스컨설팅]MySQL Monitoring
 

More from Seok-joon Yun

[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
Seok-joon Yun
 

More from Seok-joon Yun (20)

Retrospective.2020 03
Retrospective.2020 03Retrospective.2020 03
Retrospective.2020 03
 
Sprint & Jira
Sprint & JiraSprint & Jira
Sprint & Jira
 
Eks.introduce.v2
Eks.introduce.v2Eks.introduce.v2
Eks.introduce.v2
 
Eks.introduce
Eks.introduceEks.introduce
Eks.introduce
 
AWS DEV DAY SEOUL 2017 Buliding Serverless Web App - 직방 Image Converter
AWS DEV DAY SEOUL 2017 Buliding Serverless Web App - 직방 Image ConverterAWS DEV DAY SEOUL 2017 Buliding Serverless Web App - 직방 Image Converter
AWS DEV DAY SEOUL 2017 Buliding Serverless Web App - 직방 Image Converter
 
아파트 시세,어쩌다 머신러닝까지
아파트 시세,어쩌다 머신러닝까지아파트 시세,어쩌다 머신러닝까지
아파트 시세,어쩌다 머신러닝까지
 
Pro typescript.ch07.Exception, Memory, Performance
Pro typescript.ch07.Exception, Memory, PerformancePro typescript.ch07.Exception, Memory, Performance
Pro typescript.ch07.Exception, Memory, Performance
 
Doing math with python.ch07
Doing math with python.ch07Doing math with python.ch07
Doing math with python.ch07
 
Doing math with python.ch06
Doing math with python.ch06Doing math with python.ch06
Doing math with python.ch06
 
Doing math with python.ch05
Doing math with python.ch05Doing math with python.ch05
Doing math with python.ch05
 
Doing math with python.ch04
Doing math with python.ch04Doing math with python.ch04
Doing math with python.ch04
 
Doing math with python.ch03
Doing math with python.ch03Doing math with python.ch03
Doing math with python.ch03
 
Doing mathwithpython.ch02
Doing mathwithpython.ch02Doing mathwithpython.ch02
Doing mathwithpython.ch02
 
Doing math with python.ch01
Doing math with python.ch01Doing math with python.ch01
Doing math with python.ch01
 
Pro typescript.ch03.Object Orientation in TypeScript
Pro typescript.ch03.Object Orientation in TypeScriptPro typescript.ch03.Object Orientation in TypeScript
Pro typescript.ch03.Object Orientation in TypeScript
 
C++ Concurrency in Action 9-2 Interrupting threads
C++ Concurrency in Action 9-2 Interrupting threadsC++ Concurrency in Action 9-2 Interrupting threads
C++ Concurrency in Action 9-2 Interrupting threads
 
Welcome to Modern C++
Welcome to Modern C++Welcome to Modern C++
Welcome to Modern C++
 
[2015-07-20-윤석준] Oracle 성능 관리 2
[2015-07-20-윤석준] Oracle 성능 관리 2[2015-07-20-윤석준] Oracle 성능 관리 2
[2015-07-20-윤석준] Oracle 성능 관리 2
 
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
 
오렌지6.0 교육자료
오렌지6.0 교육자료오렌지6.0 교육자료
오렌지6.0 교육자료
 

[2015-06-05] Oracle TX Lock

  • 2. TX Lock : 무결성 제약 위배 가능성  Row Lock 경합은 UPDATE, DELETE 시에만 발생  But, Unique Index가 정의되어 있을 경우에는 INSERT 에서도 발생 할 수 있음 (사례1)  FK 로 연결된 Table에서 INSERT 할 경우에도 발생 할 수 있음 (사례2)  Bitmap index인 경우 1개의 엔트리에 여러 레코드가 있으므로 자주 발생 1. TX1에서 dept 테이블에 deptno = 40 인 레코드 입력 2. TX2도 deptno = 40을 입력하면, Shared 모드로 enq:TX – row lock contention 대기 이벤트 발생 3. TX1이 commit 하면 TX2는 ora-00001 (무결성 제약 조건 (PK_DEPT)에 위배) 4. TX1이 rollback 하면 TX2는 정상적으로 입력 완료  사례 1 1. TX1에서 dept 테이블에 deptno = 40 인 레코드 삭제 2. TX2에서 deptno = 40인 레코드 입력하면, Shared 모 드로 enq:TX – row lock contention 대기 이벤트 발생 3. TX1이 commit 하면 TX2는 ora-02291 (무결성 제약 조건 (FK_EMP_DEPT)에 위배) 4. TX1이 rollback 하면 TX2는 정상적으로 입력 완료  사례 2
  • 3.  Block에 레코드 추가/갱신/삭제 할 때 ITL 슬롯을 할당받고, TX ID를 기록해야 함 - 하지만, 비어있는 ITL slot이 없다면 ? Shared 모드 enq: TX – allocate ITL entry 대기 이벤트 발생 - ITL slot 하나당 24 bytes 공간필요 - ITL slot 개수는 INITRANS 로 설정 (9i부터는 3 이하로 설정 불가) CREATE TABLE T ( … ) INITRANS 5 MAXTRANS 255 PCTFREE 30; - PCTFREE : UPDATE를 위해 예약된 공간, 하지만 ITL slot이 부족할 경우 활용 가능 - MAXTRANS : 최대 생성 가능한 ITL slot 개수 (10g부터는 255로 고정)  9i부터는 Table에 INSERT시 ITL 경합 없음. Index에 INSERT 할 땐 발생 TX Lock : ITL slot 부족
  • 4.  ITL 경합이 자주 발생 하는 segment는 확인하여 INITRANS를 늘려주어야 함 - 하지만, 새로 할당되는 Block만 적용. - 기존 Block을 수정하려면 해당 Table 이나 Index 전체를 재생성 해야 함 TX Lock : ITL slot 부족 (계속) ALTER TABLE scott.dept MOVE INITRANS 5; -- INDEX가 모두 unusable 됨 ALTER INDEX scott.PK_DEPT REBUILD INITRANS 5;
  • 5.  2-Phase commit을 위한 PREPARED TX Lock에 대하여 shared 모드 enq:TX – contention 대기 이벤트가 발생 할 수 있음  Tablespace를 read-only로 전환 할 때도 발생 할 수 있음 TX Lock : 기타 Lock 발생 ALTER TABLESPACE TB_SPACE READ ONLY;
  • 6.  Oracle에서는 Row-level Lock 과 TX Lock을 조합 - Row-level Lock : Block header ITL과 Row header Lock Byte 설정 - TX-Lock : Enqueue 리소스를 통해 TX Lock을 설정  SELECT 작업에 대해서는 절대 Lock에 의한 대기 이벤트가 발생하지 않음 - 단, SELECT FOR UPDATE는 예외 - 분산 Transaction도 예외  같은 Row에 대한 DML , DDL 작업에 대해서는 Exclusive 모드의 enq:TX – row lock contention 대기 이벤트가 발생 TX Lock : DML Row Lock
  • 7.  Row-level Lock 획득시 Table Lock도 동시에 획득 - Table 구조를 변경하지 못하도록 막는 것이지, 액세스 자체를 막는 것은 아님 - TX-Lock : Enqueue 리소스를 통해 TX Lock을 설정  LOCK TABLE 명령어를 이용하여 명시적으로 설정 가능 TX Lock : DML Table Lock LOCK TABLE emp IN ROW SHARE MODE ROW EXCLUSIVE MODE SHARE MODE SHARE ROW EXCLUSIVE MODE EXCLUSIVE MODE
  • 8.  Table Lock Mode 간의 호환성 - 선행 TX와 호환되지 않는 Mode인 경우 후행 TX는 대기하거나 작업을 포기해야 함 - INSERT, UPDATE, DELETE, MERGE : RX Lock - SELECT FOR UPDATE : RS Lock  Table Lock은 Enqueue로 구현 (TM Enqueue를 이용하므로 TM Lock이라 부름) TX Lock : DML Table Lock (계속) RS RX S SRX X RS O O O O RX O O S O O SRX O X • TYPE : TM • ID1 : Object ID • ID2 : 0
  • 9.  예제에서 사용할 Lock 모니터용 Script TX Lock : DML Table Lock (예제) SELECT L.SESSION_ID SID, DECODE(LOCK_TYPE,'Transaction','TX','DML','TM') TYPE, MODE_HELD, MODE_REQUESTED MODE_REQD, DECODE(LOCK_TYPE,'Transaction',TO_CHAR(TRUNC(LOCK_ID1/POWER(2,16))), 'DML', (SELECT OBJECT_NAME FROM DBA_OBJECTS WHERE OBJECT_ID = L.LOCK_ID1)) "USN/TABLE", DECODE(LOCK_TYPE,'Transaction',BITAND(LOCK_ID1, TO_NUMBER('ffff','xxxx')) + 0) SLOT, DECODE(LOCK_TYPE,'Transaction',TO_NUMBER(LOCK_ID2)) SQN, DECODE(BLOCKING_OTHERS,'Blocking','<<<<<') Blocking FROM DBA_LOCK L WHERE LOCK_TYPE IN ('Transaction', 'DML') ORDER BY SESSION_ID, LOCK_TYPE, LOCK_ID1, LOCK_ID2  예제에서 사용한 Orange 의 모니터링 Tool : Lock Monitor
  • 10. 1. SID 14 : TM Lock X Mode 수행 TX Lock : DML Table Lock (예제) INSERT /*+ append */ INTO SCOTT.EMP_R SELECT * FROM SCOTT.EMP;  Script  Lock Monitor
  • 11. 2. SID 132 : 해당 Table에 UPDATE 시도 -> Lock 발생 TX Lock : DML Table Lock (예제)  Script  Lock Monitor UPDATE SCOTT.EMP_R SET SAL = SAL + 1 WHERE EMPNO = 7369;  v$session_wait
  • 12. 3. SID 14 : commit TX Lock : DML Table Lock (예제)  Script  Lock Monitor
  • 13. 4. SID 14 : RX Lock이 걸려있는 Row에 INSERT 시도 -> Lock 발생 TX Lock : DML Table Lock (예제)  Script  Lock Monitor UPDATE SCOTT.EMP_R SET SAL = SAL + 1 WHERE EMPNO = 7369;
  • 14. Lock에 대한 대처법  3가지 옵션중 선택이 가능 1. 기다린다 : SELECT ... FOR UPDATE (default option) 2. 조금만 기다린다 : SELECT ... FOR UPDATE WAIT 3 ORA-30006 : resource busy; acquire with WAIT timeout expired 3. 안 기다린다 : SELECT ... FOR UPDATE NOWAIT ORA-00054 : resource busy and acquire with NOWAIT specified
  • 15. Lock을 푸는 방법, Commit  Blocking : 그냥 Lock을 기다리는 거  Deadlock : 두 세션이 Lock을 설정한 뒤 서로의 Lock을 기다리는 거  Oracle은 Deadlock을 인지하여 해당 문장만 rollback 시킴 ORA-00060 : deadlock detected while waiting for resource  위 메시지를 받은 세션은 commit 또는 rollback 한 후 진행해야 함
  • 16. 비동기식 Commit  10gR2 부터 지원  사용법 COMMIT WRITE [ IMMEDIATE | BATCH ] [ WAIT | NOWAIT ] ; - WAIT (default) : LGWR가 로그버퍼를 파일에 기록했다는 완료 메시지를 받을 때까지 대기 (log file sync 대기 이벤트 발생) - NOWAIT : LGWR의 완료 메시지를 기다리지 않고 바로 다음 트랜잭션 진행 - IMMEDIATE (default) : commit 명령을 받을 때마다 LGWR가 로그 버퍼를 파일에 기록 - BATCH : 세션 내부에 트랜잭션 데이터를 일정량 버퍼링 했다가 일괄 처리  default인 IMMEDIATE WAIT는 안전하게 저장되는 것이 보장됨 (나머지는 정상적으로 완료되지 않을 수 있음)