[실무에서 바로 쓰는 SQL 기본과 SQL 튜닝][ORACLE] 15강 DML

MinHee·2023년 5월 20일
0
post-thumbnail

MERGE : 데이터 입력, 수정, 삭제를 동시에

예제 82

예시)

alter table emp
add loc varchar2(10);

merge into emp e
using dept d
on (e.deptno = d.deptno)
when matched then -- 일치하면
update set e.loc = d.loc -- 칼럼 업데이트
when not matched then -- 일치하지 않으면
insert (e.empno, e.deptno, e.loc) values (1111, d.deptno, d.loc) -- 행 삽입

사원 테이블에 부서명 칼럼을 추가하고 해당 사원의 부서명으로 값을 갱신하시오

alter table emp
add dname varchar2(10)

merge into emp e
using dept d
on (e.deptno = d.deptno
when matched then
update set e.dname = d.dname;

실행 결과

LOCK

데이터의 일관성을 보장하기 위해서 다른 세션이 어느 하나의 행에 DML문을 실행하고 COMMIT을 하기 전까지, 다른 세션에서 동일한 행을 갱신할 수 없도록 막는 기능

DML문을 실행 후 COMMIT을 하지 않으면, 다른 세션의 데이터와 달라지게 됨
여기서 오는 일관성에 관한 문제를 방지하기 위해, 아예 해당 데이터(테이블 또는 행)에 대한 접근을 막음

DML을 수행한 해당 세션에서 COMMIT을 실행하면, LOCK 상태가 해제됨

예시

세션 1 UPDATE문의 실행결과가 COMMIT으로 영구저장 될때까지, 세션 2는 접근이 불가능함 (LOCK 상태)

세션1이 COMMIT을 수행한 후, 바로 LOCK이 해제되며, UPDATE문이 실행됨

최종적으로 COMMIT을 실행한 세션의 데이터를 보게 됨

오른쪽 세션에서 아직 COMMIT을 실행하지 않았기에 9000을 출력함

어느 세션이든 최종적으로 COMMIT한 데이터를 보게 됨

세션에서 데이터를 갱신하고 있으면, 다른 세션에선 절대 갱신이 불가능하도록 하는 것

예제

ALLEN의 전체 행에 대해서 LOCK을 걸기 때문에, 실행이 불가능하다

UPDATE하는 필드에만 LOCK을 거는 것이 아니라, 전체 행에 대해서 LOCK을 건다

profile
성장하는 개발자

0개의 댓글