데이터 변경 관리 락은
DML 수행 등으로 데이터에 변화가 발생할 때 적용, 롤백과 커밋 수행시 해제, 엔큐 메커니즘 이용하여 데이터 동시성 제어
구분 | 정보 | 사원 정보 업데이트 예 | |
---|---|---|---|
{code:none | borderStyle=solid}테이블 락™{code} | 세그먼트 단위로 락이 적용 | 사원 테이블에 행 배타적(TM-RX) 모드 적용 |
{code:none | borderStyle=solid}행 락(TX){code} | 행 단위로 락이 적용, 트랜잭션 락 | 사원 테이블의 사번 1113 레코드에 배타적(TX-X) 모드 적용 |
LMOD | 이름 | 설명 | SQL |
---|---|---|---|
1 | NULL | 널락 |
|
2 | RS | 행 공유 락 |
|
3 | RX | 행 배타적 락 |
|
4 | S | 공유 락 |
|
5 | SRX | 공유 행 배타적 락 |
|
6 | X | 배타적 락 |
|
SQL> LOCK TABLE :TABLE_NAME IN :LOCK_MODE MODE [NOWAIT]
항목 | 설명 |
---|---|
:TABLE_NAME | 락을 명시적으로 적용하고자 하는 테이블 이름 |
:LOCK_MODE | 적용 하고자 하는 락 모드 - ROW SHARE(RS) - ROW EXCLUSIVE(RX) - SHARE(S) - SHARE ROW EXCLUSIVE(SRX) - EXCLUSIVE(X) |
NOWAIT | 대기 불가능 모드로 락 적용 |
SQL> LOCK TABLE 사원 IN EXCLUSIVE MODE
-- 사원 테이블에 배타적 락 적용
상황 설정
테이블 | 테이블 락 요청모드 | 테이블 락 지속기간 | 행 락 요청모드 | 행 락 지속기간 |
---|---|---|---|---|
사원 | TM-RX | 트랜잭션 | TX-X | 트랜잭션 |
부서 | TM-RS | 트랜잭션 | TX-S | DML 수행시 |
※ DML 수행 되는 사원 테이블 뿐 아니라, 부서 테이블에도 테이블/행 락 발생 (PK 테이블의 구조와 데이터가 변경되는 것을 막음)
※ 부서 테이블의 행 락(TX-S)은 DML 수행 후 바로 할당 해제, 여러 건 이라면 한 건씩 TX-S 락 적용/적용 해제
테이블 | 테이블 락 요청모드 | 테이블 락 지속기간 | 행 락 요청모드 | 행 락 지속기간 |
---|---|---|---|---|
사원 | TM-S | DML 수행 시 | ||
부서 | TM-RX | 트랜잭션 | TX-X | 트랜잭션 |
※ 부서 테이블 에서 부서코드 = 'A' 레코드를 삭제 하는 동안 사원 테이블에 해당 코드를 참조하는 데이터가 저장되면 안되므로 두 테이블 모두에 락 적용
※ 9i 이전에는 PK 테이블에 DML 발생 시 트랜잭션 완료 시점 까지 FK 테이블에 TM-S 락 적용 (FK 테이블 데이터 변경 못하게 되므로 문제가 있음)
테이블 | 테이블 락 요청모드 | 테이블 락 지속기간 | 행 락 요청모드 | 행 락 지속기간 |
---|---|---|---|---|
사원 | TM-RS | 트랜잭션 | ||
부서 | TM-RX | 트랜잭션 | TX-X | 트랜잭션 |
※ 기존에 없던 데이터의 생성 이므로 무결성을 보호할 필요가 없음
테이블 | 테이블 락 요청모드 | 테이블 락 지속기간 | 행 락 요청모드 | 행 락 지속기간 |
---|---|---|---|---|
사원 | TM-SRX → TM-RX | 트랜잭션 | TX-X | 트랜잭션 |
부서 | TM-RX | 트랜잭션 | TX-X | 트랜잭션 |
※ CASCADE 에 의해 DELETE 가 발생 하는 사원 테이블의 경우 락이 변경(TM-SRX → TM-RX)된다.
테이블 | 테이블 락 요청모드 | 테이블 락 지속기간 | 행 락 요청모드 | 행 락 지속기간 |
---|---|---|---|---|
사원 | TM-RS | 트랜잭션 | TX-S | 트랜잭션 |
부서 | TM-RX | 트랜잭션 | TX-X | DML 수행 시 |
※ FK 키 컬럼(사원.부서코드)에 인덱스가 생성된 경우 테이블에 TM-S 대신 TM-RS 락이 적용 되므로 사원 테이블에 DML 가능
구분 (적용된락) (요청락) | NULL | RS | RX | S | SRX | X |
---|---|---|---|---|---|---|
NULL | 가능 | 가능 | 가능 | 가능 | 가능 | 가능 |
RS | 가능 | 가능 | 가능 | 가능 | 가능 | 불가능(X) |
RX | 가능 | 가능 | 가능 | 불가능(X) | 불가능(X) | 불가능(X) |
S | 가능 | 가능 | 불가능(X) | 가능 | 불가능(X) | 불가능(X) |
SRX | 가능 | 가능 | 불가능(X) | 불가능(X) | 불가능(X) | 불가능(X) |
X | 가능 | 불가능(X) | 불가능(X) | 불가능(X) | 불가능(X) | 불가능(X) |
행 락(트랜잭션 락)
DML 수행 시 적용, 데이터 수정 시 배타적 모드로(enq: TX - row lock contention), 참고 시 공유 모드로 적용
1. DML 이 수행 되면 해당 데이터가 저장되어 있는 데이터 블록에 접근하여 ITL 획득
2. ITL 획득 뒤, ROWID 값으로 변경이 필요한 행에 접근하여 행 락 적용 여부 확인
ITL(Interested Transaction List
오라클 블록에 저장된 행에 대한 변경 정보 및 언두 위치 정보를 저장하는 오라클 내부 아키텍처
※ ITL 은 오라클 블록에 대한 변경을 일으키려 할 때 이를 접수하는 창구의 역할을 함.
데드락
서로 다른 트랜잭션이 상대방이 변경한 데이터에 대해서 교차 변경을 시도해서 발생하는 교착 상태
1. 트랜잭션1) UPDATE 테이블 SET ID = B WHERE ID = A (TX-X)
2. 트랜잭션2) UPDATE 테이블 SET ID = E WHERE ID = D (TX-X)
3. 트랜잭션1) UPDATE 테이블 SET ID = F WHERE ID = D (TX-X 요청 대기[순서2])
4. 트랜잭션2) UPDATE 테이블 SET ID = G WHERE ID = A (TX-X 요청 대기[순서1])
※ 이 두 트랜잭션은 대기 상태를 풀지 못하고 계속 대기하며 이런 상태를 데드락 이라고 함, 데드락 상태로 빠진 후 60초가 지나면 먼저 대기 상태로 빠진 트랜잭션(트랜잭션1)에서 ORA-00060: deadlock detected while waiting for resource 에러 발생
enq: ... 대기 이벤트 파라미터 의미