✨ Database Lock
📌 정의
📚 트랙잭션 (transaction)
-
데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위
-
ACID (Atomicity, Consistency, Isolation, Durability)
📌 종류
- Optimistic Lock ( 낙관적 락 )
-
기본적으로 데이터 갱신 시 충돌이 발생하지 않을 것이라고 낙관적으로 보는 것
-
데이터 갱신시 충돌이 발생하지 않을 것이라고 예상하기 때문에, 우선적으로 락을 걸지 않는다.
-
충돌이 난 것을 감지하면 그 때 처리.
-
버전 정보를 이용 (JPA)
@Version 어노테이션을 붙이면 엔티티가 수정될때 자동으로 버전이 하나씩 증가하며, 수정할때 조회 시점의 버전과 다를 경우 OptimisticLockException 예외가 발생한다.
[장점]
- 충돌이 안난다는 가정 하에, 동시 요청에 대해 처리 성능이 좋음
[단점]
- 잦은 충돌이 일어나는 경우 롤백 처리에 대한 비용이 많이 들어 오히려 성능에서 손해
- 롤백 처리를 구현하는게 복잡할 수 있음
- Pessimistic Lock ( 비관적 락 )
- 기본적으로 데이터 갱신시 충돌이 발생할 것이라고 비관적으로 보고 미리 잠금을 거는 것
- 데이터 갱신시 충돌이 발생할 것이라고 예상하기 때문에, 우선적으로 락을 건다. (조회할 때부터 건다.)
- 하나의 트랜잭션이 자원에 접근 시 락을 걸고, 다른 트랜잭션이 접근하지 못하게 함
[장점]
- 충돌이 자주 발생하는 환경에 대해서는 롤백의 횟수를 줄일 수 있으므로 성능에서 유리
- 데이터 무결성을 보장하는 수준이 높음
[단점]
- 데이터 자체에 락을 걸기 때문에 동시성이 떨어져 성능 손해를 많이 보게 됨. 특히, 읽기가 많이 이루어지는 DB의 경우 더욱 심함.
- 서로 자원이 필요한 경우에, 락이 걸려 있으므로 데드락이 일어날 가능성이 있음
📌 Pessimistic Lock
- Shared Lock ( 공유 락 )
- 다른 사용자가 동시에 읽을 수는 있지만, Update 와 Delete를 방지
- 데이터를 읽을 때 사용되어지는 Lock
- 공유 Lock 끼리는 동시에 접근 가능
- 공유 Lock이 설정된 데이터에 베타 Lock 사용 불가능
- Exclusive Lock ( 베타 락 )
- 데이터를 변경하고자 할 때 사용, 트랜잭션이 완료될 때까지 유지
- 베타락은 Lock이 해제될 때까지 다른 트랜잭션 (읽기 포함) 은 해당 리소스에 접근 불가능
📌 Lock 의 설정 범위
- 데이터베이스
- 전체 데이터베이스를 기준으로 lcok
- 1개의 세션만이 데이터에 접근 가능
- 일반적으로 사용하지 않는다.
- 스키마를 변경하거나 DB의 소프트웨어 버전을 올리는 등에 사용
- 파일
- 파일을 기준으로 lock
- 파일이란 테이블, row 등과 같은 실제 데이터가 쓰여지는 물리적인 저장소
- 테이블
- 테이블을 기준으로 lcok
- 테이블의 모든 행을 업데이트 하는 등의 전체 테이블에 영향을 주는 변경을 수행할 때 유용
- DDL(create, alter, drop 등) 구문과 함께 사용되며 DDL Lock이라고도 함
- 페이지와 블럭
- 파일의 일부인 페이지와 블록을 기준으로 lock
- 컬럼
- 컬럼을 기준으로 lock
- lock 설정 및 해제의 리소스가 많이 들기 때문에 일반적으로 사용되지 않음
- 행
- 1개의 행(Row) 를 기준으로 lock
- DML(insert, update, delete 등) 에 대한 Lock으로 가장 일반적으로 사용됨
📌 Blocking ( 블로킹 )
- Lock 간 (베타-베타, 베타-공유) 의 경합이 발생하여 특정 트랜잭션이 작업을 진행하지 못하고 멈춰선 상태를 말함.
- 공유락끼리는 블로킹이 발생하지 않지만 베타락은 블로킹을 발생시킨다.
- 블로킹을 해소하기 위해서는 이전의 트랜잭션이 커밋 혹은 롤백되어야 한다.
- 개발자가 불필요하게 높은 잠금(lock) 레벨로 코딩하였기 때문
- 개발자가 불필요하게 긴 트랜잭션으로 코딩하였기 때문
- 사용자가 커밋해야 하는 변경사항을 커밋하지 않았기 때문
📌 DeadLock ( 교착상태 )
- 두 트랜잭션이 각각 Lock 을 설정하고, 서로의 Lock에 접근하여 값을 얻어오려고 할 때 발생되는 무한대기상태를 의미
- 교착상태가 발생하면 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