티스토리 뷰
데이터베이스(DB) Lock
동시성 제어를 위해 사용되는 중요한 메커니즘
여러 사용자가 동시에 같은 데이터에 접근할 때, 데이터 충돌을 방지하고 데이터의 일관성과 무결성을 유지하기 위해 데이터베이스 락을 사용
잠금 적용의 범위
- 데이터베이스(Database) : 데이터베이스 백업/복구 또는 스키마 변경 작업을 수행
- 테이블(Table) : 데이터베이스 내 모든 테이블에 락 설정, 주로 대규모 작업 및 테이블 구조 변경 시 사용
- 페이지(Page) : 디스크나 메모리에서 관리되는 데이터 블록 = 페이지, 특정 범위에 대한 락 설정
- 행(Row) : 특정 데이터 행에 락 설정, 여러 트랜잭션이 같은 테이블 내 서로 다른 행 작업 가능, 주로 읽기/쓰기 혼합 트랜잭션 유리
- 컬럼(Column) : 매우 세밀한 범위로 락 설정, 대부분의 DBMS에서는 지원하지 않음
동시성 : 컬럼(많음) > 행 > 페이지 > 테이블 > 데이터베이스(적음)
복잡성 : 컬럼(높음) > 행 > 페이지 > 테이블 > 데이터베이스(낮음)
데이터베이스(DB) Lock 종류
1. 낙관적 락(Optimistic Lock)
- 동시성 이슈가 생길 때 처리
- 수정할 때 수정한다고 명시하여 다른 트랜잭션이 동일 조건 값으로 수정하지 못하게 하는 것
- 락을 사용하지 않고 일반적으로 version 또는 timestamp를 보고 변경 여부 확인 후 처리하며 버전 정보가 변경되지 않았다면 데이터를 수정하고 버전을 증가, 버전이 변경되었다면 충돌이 발생한 것으로 간주하고 롤백
- 동시성 이슈가 발생했을 때 DB가 아닌 애플리케이션 단에서 처리
-- 데이터 조회 시 현재 버전 정보를 가져옴
SELECT id, name, version
FROM student
WHERE id = 1;
-- 데이터 수정 시 버전을 검증
UPDATE student
SET name = 'Jane', version = version + 1
WHERE id = 1 AND version = 2;
-- 버전이 일치하지 않으면 업데이트 실패
≫ JPA에서의 낙관적 락
@Version 어노테이션을 통해 낙관적 락 사용 !
낙관적 락이 발생하는 경우 ObjectOptimisticLockingFailureException 예외가 발생하고 이를 애플리케이션 단에서 처리
2. 비관적 락(Pessimistic Lock)
- 비관적 락의 구체적인 동작 형태로는 공유 락, 베타 락이 존재
- Repeatable Read 또는 Serializable 정도의 격리성 수준을 제공
- 장시간 트랜잭션이 유지되면 데드락 현상 발생 가능성 ↑
-- 수정 작업을 위한 배타 락 설정
SELECT id, name
FROM student
WHERE id = 1
FOR UPDATE;
-- 락이 걸린 상태에서 데이터 수정
UPDATE student
SET name = 'Jane'
WHERE id = 1;
-- 트랜잭션 종료 후 락 해제
COMMIT;
- 공유 락(Shared Lock, S Lock)
- Read Lock이라고도 하며 데이터 읽기 전용 잠금
- Read Lock을 하게 되면 락을 획득한 데이터는 INSERT, UPDATE, DELETE 작업이 불가
- 여러 트랜잭션이 공유 락을 걸 수 있으며 대신 조회 외 작업은 불가 - 베타 락(Exclusive Lock, X Lock)
- Write Lock이라고도 하며 데이터 쓰기 전용 잠금
- Write Lock을 하게 되면 수정 중인 트랜잭션 외에 어떠한 트랜잭션의 조회 및 수정 작업 모두 불가
비관적 락의 특징인 락을 통한 동시성 제어로 인해 발생하는 대표적인 2가지 문제
1. Blocking (블로킹)
한 트랜잭션이 특정 데이터에 락을 설정한 상황에서 다른 트랜잭션이 같은 데이터에 접근하려고 하면 대기 상태가 발생하는데 이 때 락이 해제될 때까지 다른 트랜잭션이 블로킹되어 다른 트랜잭션의 개입을 막는 것
트랜잭션 간 충돌이 많아질 수록 락이 해제될 동안 Latency가 길어지는 현상 발생 가능
[참고]
- set lock_timeout 0 : 블로킹이 걸려있으면 곧바로 종료
- set lock_timeout -1 : 블로킹이 걸려있으며 해지될 때까지 무작정 기다림 (기본값)
2. Deadlock (데드락 = 교착상태)
두 개 이상의 트랜잭션이 서로 상대방이 보유한 락을 기다리면서 무한 대기에 빠질 때 발생
[발생조건]
- 상호 배제
- 점유와 대기
- 비선점
- 환형(순환) 대기
해결하기 위한 방법은 없으며 회피, 예방, 탐지 및 복구 전략으로 상황에 맞는 방식을 적용
[참조]
https://datacodingschool.tistory.com/100
- Total
- Today
- Yesterday
- 동시성이슈해결방안
- 데이터베이스락
- 이미지맵
- 낙관적락
- redisson적용
- MVC패턴구조
- gitlab_mr_templates
- querydsl
- redis
- gitlab
- 동시성이슈
- imgmap
- github사용법
- gitlab_merge_request_templates
- db락
- 데드락
- JPQL
- mybatis
- 블로킹
- Redisson
- git #git_branch_전략 #gitlab_mr
- 반응형이미지맵
- 비관적락
- redis특징
- MVC패턴
- SpringDataJpa
- redisson분산락
- MVC패턴정의
- GitHub
- MVC패턴특징
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |