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

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

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

예시)

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을 실행하지 않았기에 9000을 출력함

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

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

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

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

profile
성장하는 개발자

0개의 댓글