DataBase Lock

고승원·2022년 12월 8일
0

DB

목록 보기
1/6

데이터베이스 락
DB의 트랜잭션 처리의 순차성을 보장하기 위해 데이터 변경을 일시적으로 중지하는 것.
일반적으로 일관성과 무결성을 유지하기 위해 DB에서 사용하는 공통적인 방법이다.

락은 데이터베이스 뿐만 아니라 어플리케이션에서도 걸 수 있는데, 어플리케이션단에서 거는 락은 대체로 Optimistic DB에서 거는 것은 대체로 Pessemistic락이다.

Optimistic

낙관적 (충돌시 락) : 실제 데이터베이스에 락을 걸지 않기 때문에 데드락 적음, 충돌이 빈번하지 않으면 성능이 좋다. (보통 버저닝을 가장 많이 사용한다.)
충돌을 인지하는 시점이 커밋 시점이므로, 충돌이 발생해서 롤백해야 한다고 했을 때, 그 전에 수행했던 모든 동작이 롤백되어야 하므로 충돌시 오버헤드가 크다.

Versioning

  • 직접 만들기 쉬움 (JPA @Version 을 사용하면 사용가능)
  • 데이터를 버전으로 관리해서 데이터베이스 충돌 관리 한다.
    TimeStamping
  • 시간 정보를 사용해서 데이터 베이스 충돌 관리 한다.
    Checksumming
  • 데이터의 해시값을 사용하여 충돌을 방지한다.

Pessemistic

비관적 (충돌 예상시 락) : 실제 데이터베이스에 락을 건다.
대체로 DB에서 설정
충돌이 발생하는 시점을 바로 인지 하므로, 충돌이 발생했을 때, 낙관적 락보다 오버헤드가 덜하다 / 데이터 무결성을 지키기 용이하다.
락을 건다는 것 자체가 데이터 베이스 리소스를 사용하는 것이므로 충돌이 없으면 오버헤드 발생

Pessemistic 락에 대한 설명(InnoDB)

공통적으로

X락(exclusive)

  • 동시에 같은 컬럼을 write할 때
  • x락이 걸려있으면 다른 트랜잭션은 x, s 락 걸 수 없음
  • 가장 높은 강도의 락

S락(shared)

  • 여러 락 걸기 가능(read lock)
  • share mode 명시하면 락
  • 가장 낮은 강도의 락

외에도 update lock, intent lock이 있다.

InnoDB는 어떤 락 방식을 사용할까?

레코드락

  • 인덱스를 잠군다.
  • 인덱스가 없으면 custered index를 잠군다

gap lock

  • index가 없는 부분에 대한 lock

데드락이 생기는 경우

  • 서로 참조하는 테이블이 x락을 걸 경우

→ deadlock detection (작은 트랜잭션을 롤백 시킴)

→ lock wait timeout (일정시간 지나면 감지)

etc

  • next key lock
  • table lock

락에대해 고민할 때 고려사항

  • 충돌이 빈번한지

  • 읽기 / 쓰기 연산의 비율

    	-> 일반적인 웹 어플리케이션은 읽기가 대부분이므로 웹 어플리케이션은 낙관적 lock을 사용한다.

그럼 DB에서 처리하는 락은 어떤 것들이 있을까?

perssimistic lock은 데이터베이스, 엔진마다 상이하기 때문에 사용하는 제품 또는 버전에 따라 공부하고 사용해야한다.

profile
봄은 영어로 스프링

0개의 댓글

관련 채용 정보