본문 바로가기

DB

[DB] 락

DB 세션1이 트랜잭션을 시작하고 데이터를 수정하는 동안 아직 커밋을 시작하지 않았는데, 세션2에서 동시에 같은 데이터를 수정하게 되면 여러가지 문제가 발생한다. (원자성이 깨짐)

 

이런 문제를 방지하려면, 세션이 트랙재션을 시작하고 데이터를 수정하는 동안에는 커밋이나 롤백 전가지 다른 세션에서 해당 데이터를 수정할 수 없게 막아야 한다.

 

EX)

세션1이 트린잭션을시작하면 DB는 해당 로우의 락을 세션1에 제공한다. 

이때, 세션2가 동일한 로우를 수정하려고 하면 해당 로우에 락이 없으므로 돌아올 때 까지 대긴한다.

(무한정 대기는 아님, 락 대기 시간이 넘어가면 락 타임아웃 오류가 발생하며 설정가능하다.)

 

락 타임아웃 시간 설정

SET LOCK_TIMEOUT <milliseconds>

ex) SET LOCK_TIMEOUT 10000 > 10초, 세션이 10초동안 대기해도 락을 얻지 못하면 락 타임아웃 오류가 발생한다.

 

 

DB락 조회

조회(select)시에도 db락을 가져올 필요가 있는 경우가 있다.

[select ... for update]

ex) 세션1이 select for update구문으로 조회를 하고 있는 있는데, 세션 2가 update를 하면 락이 없으므로 update가 되지 않는다. 그 후 세션1이 커밋, 롤백을 하고 나서야 세션2 update가 커밋이 된다.

 

'DB' 카테고리의 다른 글

[MySQL] ORDER BY에 연산자 사용하기  (0) 2021.12.17
[MySQL] Join  (0) 2021.12.17
[MySQL] Ubuntu에 데이터베이스 테이블 생성 및 확인  (0) 2021.01.11