Computer Science

DB Lock

재심 2024. 10. 7. 11:07

[DB 락이 없다면?]

데이터의 무결성이 깨질 수 있는 상황이 발생함.

 

예시

세션1, 세션2가 각각 트랜잭션을 걸고 사용자A의 money 필드를 업데이트 하려고 한다.

 

초기값: 100

 

락이 없다면..

1. 세션1이 +50을하여 150으로 만듦. 커밋은 하지 않음

2. 세션2가 +100을 하여 200으로 만듦. 커밋은 하지 않음.

3. 세션1이 커밋을 한다. 150원이 되었다.

4. 세션2가 커밋을 한다. 200원이 되었다.

 

=> 결과가 250이 아닌 200이 되었다.

 

락이 있다면..

1. 세션1이 +50을 하여 150을 만듦. 커밋은 하지 않음

2. 세션2가 +100을 하려고 하는데 세션1이 락을 걸고 들어가서 접근하지 못하고 대기한다.

3. 세션1이 커밋한다. 150이 반영된다.

4. 세션2가 접근해서 +100을 한다.

5. 세션2가 커밋을 하여 250이 커밋되었다.

[Lock의 종류]

  • shared lock (Read Lock) - 읽을 때 사용하는 락. 공유락이 설정된 경우 다른 세션이 읽을 수는 있지만 쓰기는 불가하다 (배타락 접근 불가)
  • exclusive lock (Write Lock) - 다른 세션의 접근 자체가 불가능하다. 트랜잭션이 완료되어야 락이 해제된다.

[Lock에서 발생할 수 있는 문제들]

블로킹 (Blocking)

블로킹 상태는 한 트랜잭션이 특정 자원(예: 테이블이나 레코드)을 사용하려고 시도할 때, 그 자원이 이미 다른 트랜잭션에 의해 락이 걸려 있어 기다리는 상태.

 

1. 세션A가 업데이트를 위해 배타락을 걸고 들어감

2. 세션B가 조회를 시도하나 배타락이 걸려있어 대기함.

 

교착상태 (Deadlock)

1. 세션A가 테이블1을 업데이트하기 위해 배타락을 걸고 트랜잭션을 시작함

2. 세션B가 테이블2를 업데이트하기 위해 배타락을 걸고 트랜잭션을 시작함.

3. 세션A가 테이블2를 데이터에 접근하려고하나 이미 락이 걸려서 있어서 대기한다.

4. 세션B가 테이블1에 접근하고자하자 이미 락이 걸려서 있어서 대기한다.

5. 무한대기..

 

해결방법

  • timeout 설정하기. 일정시간동안 트랜잭션이 실행되지 않으면 롤백함
  • 데이터 접근 순서를 세우기. 테이블1, 테이블2 순서대로 업데이트한다와 같은 규칙을 세움
  • 특정 DB들의 데드락 감지 기능 (MySql etc..)
  • 트랜잭션 생성 시기로 선점 여부를 가려내기
    • wait - die: 트랜잭션A가 트랜잭션B가 가진 락을 요청했을 때 트랜잭션A가 먼저 생성된 트랜잭션이면 대기. 나중에 들어온 트랜잭션이면 die하고 나중에 다시 요청
    • woud - wait: 트랜잭션A가 먼저 왔다면 선점 (woud) (트랜잭션B를 종료하게 해버림). 아니라면 대기 (wait)

 

참조

https://coding-business.tistory.com/32

'Computer Science' 카테고리의 다른 글

웹 서버와 WAS의 차이?  (0) 2024.10.26
빅오 (Big-O)에 대해..  (2) 2024.10.06