데이터베이스 락이란 ?

bbookng·2023년 5월 30일
0

CCPP

목록 보기
1/4

✨ Database Lock

📌 정의

  • 트랜잭션 처리의 순차성을 보장하기 위한 방법

  • 여러 사용자들이 같은 데이터를 동시에 접근하는 상황에서 데이터의 무결성과 일관성을 지키기 위해 사용

  • ex) 수강신청, 도서 대출 ...

📚 트랙잭션 (transaction)

  • 데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위

  • ACID (Atomicity, Consistency, Isolation, Durability)


📌 종류

img

- Optimistic Lock ( 낙관적 락 )

  • 기본적으로 데이터 갱신 시 충돌이 발생하지 않을 것이라고 낙관적으로 보는 것

  • 데이터 갱신시 충돌이 발생하지 않을 것이라고 예상하기 때문에, 우선적으로 락을 걸지 않는다.

  • 충돌이 난 것을 감지하면 그 때 처리.

  • 버전 정보를 이용 (JPA)

    @Version 어노테이션을 붙이면 엔티티가 수정될때 자동으로 버전이 하나씩 증가하며, 수정할때 조회 시점의 버전과 다를 경우 OptimisticLockException 예외가 발생한다.
[장점]
  • 충돌이 안난다는 가정 하에, 동시 요청에 대해 처리 성능이 좋음
[단점]
  • 잦은 충돌이 일어나는 경우 롤백 처리에 대한 비용이 많이 들어 오히려 성능에서 손해
  • 롤백 처리를 구현하는게 복잡할 수 있음

- Pessimistic Lock ( 비관적 락 )

  • 기본적으로 데이터 갱신시 충돌이 발생할 것이라고 비관적으로 보고 미리 잠금을 거는 것
  • 데이터 갱신시 충돌이 발생할 것이라고 예상하기 때문에, 우선적으로 락을 건다. (조회할 때부터 건다.)
  • 하나의 트랜잭션이 자원에 접근 시 락을 걸고, 다른 트랜잭션이 접근하지 못하게 함
[장점]
  • 충돌이 자주 발생하는 환경에 대해서는 롤백의 횟수를 줄일 수 있으므로 성능에서 유리
  • 데이터 무결성을 보장하는 수준이 높음
[단점]
  • 데이터 자체에 락을 걸기 때문에 동시성이 떨어져 성능 손해를 많이 보게 됨. 특히, 읽기가 많이 이루어지는 DB의 경우 더욱 심함.
  • 서로 자원이 필요한 경우에, 락이 걸려 있으므로 데드락이 일어날 가능성이 있음

📌 Pessimistic Lock

- Shared Lock ( 공유 락 )

  • 다른 사용자가 동시에 읽을 수는 있지만, Update 와 Delete를 방지
  • 데이터를 읽을 때 사용되어지는 Lock
  • 공유 Lock 끼리는 동시에 접근 가능
  • 공유 Lock이 설정된 데이터에 베타 Lock 사용 불가능

- Exclusive Lock ( 베타 락 )

  • 데이터를 변경하고자 할 때 사용, 트랜잭션이 완료될 때까지 유지
  • 베타락은 Lock이 해제될 때까지 다른 트랜잭션 (읽기 포함) 은 해당 리소스에 접근 불가능

📌 Lock 의 설정 범위

  1. 데이터베이스
    • 전체 데이터베이스를 기준으로 lcok
    • 1개의 세션만이 데이터에 접근 가능
    • 일반적으로 사용하지 않는다.
    • 스키마를 변경하거나 DB의 소프트웨어 버전을 올리는 등에 사용
  2. 파일
    • 파일을 기준으로 lock
    • 파일이란 테이블, row 등과 같은 실제 데이터가 쓰여지는 물리적인 저장소
  3. 테이블
    • 테이블을 기준으로 lcok
    • 테이블의 모든 행을 업데이트 하는 등의 전체 테이블에 영향을 주는 변경을 수행할 때 유용
    • DDL(create, alter, drop 등) 구문과 함께 사용되며 DDL Lock이라고도 함
  4. 페이지와 블럭
    • 파일의 일부인 페이지와 블록을 기준으로 lock
  5. 컬럼
    • 컬럼을 기준으로 lock
    • lock 설정 및 해제의 리소스가 많이 들기 때문에 일반적으로 사용되지 않음
    • 1개의 행(Row) 를 기준으로 lock
    • DML(insert, update, delete 등) 에 대한 Lock으로 가장 일반적으로 사용됨

📌 Blocking ( 블로킹 )

  • Lock 간 (베타-베타, 베타-공유) 의 경합이 발생하여 특정 트랜잭션이 작업을 진행하지 못하고 멈춰선 상태를 말함.
  • 공유락끼리는 블로킹이 발생하지 않지만 베타락은 블로킹을 발생시킨다.
  • 블로킹을 해소하기 위해서는 이전의 트랜잭션이 커밋 혹은 롤백되어야 한다.
img

- 개발자가 불필요하게 높은 잠금(lock) 레벨로 코딩하였기 때문

- 개발자가 불필요하게 긴 트랜잭션으로 코딩하였기 때문

- 사용자가 커밋해야 하는 변경사항을 커밋하지 않았기 때문


📌 DeadLock ( 교착상태 )

  • 두 트랜잭션이 각각 Lock 을 설정하고, 서로의 Lock에 접근하여 값을 얻어오려고 할 때 발생되는 무한대기상태를 의미
img
  • 교착상태가 발생하면 DBMS가 둘 중 한 트랜잭션에 에러를 발생시킴으로써 문제를 해결
  • 교착상태가 발생할 가능성을 줄이기 위해서는 접근 순서를 동일하게하는 것이 중요

📌 참고

https://unluckyjung.github.io/db/2022/03/07/Optimistic-vs-Pessimistic-Lock/

https://willbfine.tistory.com/576?category=971447

https://eddie-park.tistory.com/20

https://sabarada.tistory.com/121

https://wonit.tistory.com/462

https://devkingdom.tistory.com/287

0개의 댓글