DB
[DB] 락(LOCK)이란?
mndev
2024. 2. 6. 09:54
락(LOCK)
- 같은 데이터를 동시에 갱신할 수 없는 락(LOCK)
터미널 1
update emp
set sal = 3000
where ename = 'JONES';
터미널2
update emp
set sal = 9000
where ename = 'JONES';
- 터미널 1에서 JONES의 월급을 3000으로 변경
- 터미널 2에서도 JONES의 월급을 9000으로 변경, 하지만 변경되지 않고 update문에 멈춰 있음, 터미널 창1에 접속한 행이 갱신하고 아직 commit이나 롤백을 수행하지 않았기 때문에 행이 잠겨 있음
- update문을 수행하면 update대상이 되는 행을 잠가(LOCK)버림
- update는 행전체르 잠그기 때문에 JONES 월급뿐만 아니라 다른 컬럼들의 데이터도 변경할 수 없고 WATING하게 됨
commit;
1행이 업데이트 되었습니다.
- update는 행 전체를 잠그기 때문에 JONE의 월급 뿐만 아니라 다른 컬럼들의 데이터도 변경할 수 없고 WAITING 하게 된다.
- 터미널 창1에서 COMMIT을 수행하게 되면 JONES의 월급은3000으로 저장되고 행에 걸렸던 잠금은 해제
- 터미널 창1에서 잠금을 해제 했기 때문에 창2도 수정 가능
락(LOCK)을 사용하는 이유
- 락(LOCK)을 거는 이유는 데이터의 일관성을 보장하기 위함
- 자기가 변경한 데이터를 커밋하기 전까지 일관되게 유지
SELECT FOR UPDATE
- 검색하는 행에
락(LOCK)
을 거는것
터미널1
select ename, sal, deptno
from emp
where ename = 'JONES'
for update;
터미널2
update emp
set sal = 9000
where ename ='JONES';
- SELECT FOR UPDATE문을 사용해 JONES 데이터 검색, JONES 행에 자동으로 락(LOCK) 걸림
- JONES의 월급을 9000으로 변경이 안되고 WAITING
- 터미널1창에서 commit을 수행하게 되면 LOCK이 해제되면서 터미널 창2의 UPDATE문이 수행