[Database] 낙관적 락과 비관적 락
2023. 5. 10. 14:15
반응형
데이터베이스의 충돌 상황
우리는 데이터베이스에 일련의 연산을 통해 데이터를 변경한다.
그 때, 동시에 데이터베이스에 접근하여 수정을 요청하면 충돌이 일어날 수 있다.
이런 충돌에 대비하기 위해서 낙관적 락과 비관적 락에 대해서 알아보도록 하자.
낙관적 락
낙관적 락은 충돌을 난 것을 감지할 때 처리하자는 방법이다.
일반적으로 테이블의 Version 컬럼이나 Timetable 등 데이터의 상태 구분 컬럼을 이용한다.
트랜잭션이 시작할 때 구분 컬럼을 읽은 후, 트랜잭션이 끝난 시점에서 변경 여부를 확인한다.
만약 구분 컬럼이 도중에 변경되었을 시 충돌을 감지하고, 변경 내용을 롤백하게 된다.
장점
- 충돌이 거의 나지 않는 환경에서 처리 성능이 비관적 락에 비해서 좋다.
- 다른 트랜잭션이 데이터에 접근하는 것을 제어하지 않기 때문에 동시성이 높다.
단점
- 충돌을 방지하지 못한다
- 충돌 시 롤백처리를 해야한다.
- 충돌이 빈번할 경우 오히려 처리 비용이 크다.
비관적 락
충돌 문제가 발생할 것이라고 생각하는 자원에 Lock을 걸어 사용하는 방법이다.
트랜잭션이 어떤 자원을 읽을 때 Lock을 걸면, 다른 트랜잭션에서는 자원의 접근이 제한된다.
SQL문으로는 SELECT FOR UPDATE나 SELECT FOR SHARE를 통해 선택한 해당 자원은 내 트랜잭션이 끝날 때 까지 사용할 것이므로 제한할 것이라고 명시한다.
공유락과 베타락
공유락 : 조회한 데이터에 대한 WRITE를 제한한다.
베타락 : 조회한 데이터에 대한 다른 트랜잭션에서의 READ/WRITE를 제한한다.
장점
- 데이터의 일관성을 보장할 수 있다.
- 데이터베이스 격리 수준을 보장하고 높일 수 있다.
- 데이터베이스 Isolation 수준이 SERIALIZABLE일 때에도, 공유락을 사용하므로 다른 트랜잭션에서의 Write를 막을 뿐 Read는 가능한 상태이다. 베타락을 사용한다면 Read도 막을 수 있다.
- 데이터베이스의 격리 수준은 아래의 포스팅을 참고하자
https://sjh9708.tistory.com/40
단점
- 다른 트랜잭션이 데이터를 사용하지 못해, 동시성이 낮아진다.
- 대규모 트래픽에서의 성능 저하 가능성이 있다.
- 트랜잭션끼리 서로 다른 자원을 선점 시, 데드락이 걸릴 위험성이 있다.
상호 배제와 데드락
https://sjh9708.tistory.com/12
반응형
'Database > 데이터베이스' 카테고리의 다른 글
[Database] 트랜잭션(Transaction), ACID 및 Isolation Level (0) | 2023.02.25 |
---|---|
[Database] 데이터베이스 정규화 (0) | 2023.02.04 |
[Database/Oracle] 데이터베이스 동의어 (0) | 2022.06.27 |
[Database/Oracle] 스키마 이름과 데이터베이스 링크 (0) | 2022.06.27 |