Oracle 잠금 1: DML 잠금

DML 잠금은 데이터 잠금(data lock)이라고도 하는데, 여러 사용자가 데이터를 조작할 때 데이터의 완전성을 보장하는 데 쓰인다.DML 잠금은 서로 충돌하는 DML 및 DDL 작업이 동시에 발생하지 않도록 합니다.
DML 잠금에는 행 잠금(Row Locks, TX)과 테이블 잠금(Table Locks, TM)이 있으며, 서로 다른 DML 작업은 자동으로 해당 잠금을 요청합니다.
라인 잠금(Row Locks, TX)
줄 자물쇠도 TX 자물쇠라고 하는데 시계의 한 줄 데이터를 잠그는 데 쓰인다.트랜잭션이 한 줄의 데이터에 대해 INSERT, UPDATE, DELETE, MERGE 또는 SELECT를 작성하는 경우FOR UPDATE 작업에서는 트랜잭션이 commit이나 roll back 작업을 수행한 후에야 데이터가 행에 행 자물쇠를 추가합니다.
줄 잠금은 두 업무가 같은 줄의 데이터를 수정하는 것을 방지한다. 한 업무가 한 줄의 데이터를 수정할 때 데이터베이스는 항상 수정된 줄에 줄 잠금을 추가해서 다른 업무가 이 줄을 수정할 수 없다. 업무가commit이나 roll back 작업을 실행한 후에야 데이터베이스에 대응하는 잠금을 풀 수 있다.행 자물쇠는 소립도 자물쇠로 응용에 최대한의 병렬 수정 데이터를 제공한다.
하나의 업무가 줄 자물쇠를 가져오면, 이 업무도 이 줄 데이터가 있는 테이블의 자물쇠를 가져와야 한다. 테이블 자물쇠는 충돌하는DDL 작업을 막는다. 즉, 데이터베이스는 자동으로 업데이트된 줄에 줄 자물쇠를 추가하고, 줄이 있는 테이블에 하위 줄 자물쇠를 추가한다.
행 잠금 및 동시 연결
다음은 하나의 예를 통해 줄 자물쇠와 병발의 관계를 이해한다.
먼저 다음 테이블을 만들고 데이터를 초기화합니다.
create table employees(employee_id number(10),salary number(10));
insert into employees(employee_id,salary) values(100,512);
insert into employees(employee_id,salary) values(101,600);
......
단계1: 세 개의 세션이 ID가 100과 101인 직원을 동시에 조회하고 조회 결과가 일치한다.
Session 1:
SELECT employee_id, salary FROM employees WHERE employee_id IN (100, 101);
EMPLOYEE_ID		SALARY
-------------------------
100				512
101				600

Session 2:
SELECT employee_id, salary FROM employees WHERE employee_id IN (100, 101);
EMPLOYEE_ID		SALARY
-------------------------
100				512
101				600

Session 3:
SELECT employee_id, salary FROM employees WHERE employee_id IN (100, 101);
EMPLOYEE_ID		SALARY
-------------------------
100				512
101				600
단계2: 세션 1이 업데이트 작업을 수행하고 id가 100인 직원을 업데이트합니다. 이 업데이트에서 작성자는 한 줄 자물쇠를 요청하여 다른 작성자가 이 줄 데이터를 업데이트하는 것을 막습니다. 만약에 다른 작성자가 이 줄 데이터를 업데이트하면 세션 1이 데이터를 제출하거나 굴러갈 때까지 막힙니다.
Session 1:
update employees set salary = 612 where employee_id = 100
단계 3: 단계 1의 작업을 다시 수행합니다.
Session 1:
SELECT employee_id, salary FROM employees WHERE employee_id IN (100, 101);
EMPLOYEE_ID		SALARY
-------------------------
100				612
101				600

Session 2:
SELECT employee_id, salary FROM employees WHERE employee_id IN (100, 101);
EMPLOYEE_ID		SALARY
-------------------------
100				512
101				600

Session 3:
SELECT employee_id, salary FROM employees WHERE employee_id IN (100, 101);
EMPLOYEE_ID		SALARY
-------------------------
100				512
101				600
세션 1의 결과는 업데이트된 데이터이고 다른 두 세션은 낡은 데이터입니다.
4단계: Session 2는 101 직원의 급여를 갱신하고 데이터를 제출하지 않아 직원 101에 대한 자물쇠를 획득한다.
UPDATE hr.employees SET salary = salary + 100 WHERE employee_id = 101;
5단계: 1단계 질의를 다시 수행합니다.
Session 1:
SELECT employee_id, salary FROM employees WHERE employee_id IN (100, 101);
EMPLOYEE_ID		SALARY
-------------------------
100				612
101				600

Session 2:
SELECT employee_id, salary FROM employees WHERE employee_id IN (100, 101);
EMPLOYEE_ID		SALARY
-------------------------
100				512
101				700

Session 3:
SELECT employee_id, salary FROM employees WHERE employee_id IN (100, 101);
EMPLOYEE_ID		SALARY
-------------------------
100				512
101				600

자물쇠 저장소
Oracle은 데이터 블록에 잠금 정보를 저장합니다.데이터베이스는 하나의 대기열 메커니즘으로 줄 잠금 요청을 처리합니다. 만약 하나의 사무 요청이 잠기지 않은 줄이라면, 사무는 데이터 블록에 잠깁니다. 사무가 수정된 줄마다 블록 헤더에 저장된 사무 ID의 복사본을 가리킵니다.
하나의 업무가 끝날 때, 업무 ID는 Block header에 저장됩니다. 다른 업무가 한 줄의 데이터를 수정하려고 한다면, 이 업무 ID로 이 자물쇠가 활성화되었는지 여부를 판정합니다.자물쇠가 활성화되면, 자물쇠가 풀릴 때, 이 사무의session이 알림을 받을 것입니다. 그렇지 않으면, 사무가 이 자물쇠를 가져옵니다.
테이블 잠금(Table Locks, TM)
테이블 잠금(TM 잠금)이라고도 하는데 테이블에 대해 다음과 같은 작업을 수행할 때 요청됩니다. INSERT, UPDATE, DELETE, MERGE, SELECT...FOR UPDATE 및 LOCK TABLE.테이블 잠금을 요청하는 DML 작업은 충돌하는 다른 DDL 작업을 차단합니다.
테이블 잠금에는 다음과 같은 모드가 있습니다.
Row Share(RS)
이 자물쇠는subshare table lock (SS) 이라고도 하는데, 사무 보유표의 자물쇠가 시계의 줄을 잠그고 업데이트할 계획임을 나타낸다.Row share 자물쇠는 최소한의 시계 자물쇠로 시계의 줄 데이터의 높은 병렬 수정을 지원합니다.
Row Exclusive Table Lock(RX)
이 장소는subexclusive table lock(SX)라고도 하는데, 보통 자물쇠를 가진 업무가 테이블의 줄을 업데이트하거나 SELECT를 실행했음을 나타냅니다.FOR UPDATE.SX 자물쇠는 다른 사무 조회, 삽입, 업데이트, 삭제 또는 같은 테이블에서 여러 줄의 데이터를 잠글 수 있기 때문에 SX 자물쇠는 여러 사무가 같은 테이블에서 SX와 RS 자물쇠를 동시에 가져올 수 있습니다.
Share Table Lock(S)
하나의 사무가 시계의 S 자물쇠를 가지고 있으며, 다른 사무가 이 표를 조회할 수 있도록 허용한다. (SELECT... FOR UPDATE 제외). 그러나 S 자물쇠를 가진 사무만 표를 업데이트할 수 있다.여러 개의 사무가 동시에 S 자물쇠를 소지할 수 있기 때문에 S 자물쇠를 가져와도 사무가 표를 수정할 수 있다고 보장할 수 없다.
Share Row Exclusive Table Lock(SRX)
이 자물쇠는share-subexclusive table lock(SSX)라고도 하는데 S 자물쇠보다 제한이 강하다.SSX 잠금을 가져올 수 있는 트랜잭션은 테이블의 한 시점에 하나뿐입니다.SSX 잠금은 SELECT...FOR UPDATE를 제외한 다른 트랜잭션 쿼리 테이블을 허용하지만 테이블을 업데이트할 수는 없습니다.
Exclusive Table Lock(X)
이 자물쇠는 제한이 가장 강하기 때문에 다른 업무에서 어떤 종류의 DML 작업을 실행하거나 테이블에서 자물쇠를 방지하는 것을 금지합니다.

좋은 웹페이지 즐겨찾기