mun dev

[DB] 락(LOCK)이란? 본문

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문이 수행