2023. 4. 11. 10:20ㆍ몰랐던거/DB
DB Lock이란?
DB는 여러 사용자들이 동시에 같은 데이터에 접근하는 경우 데이터의 무결성과 일관성을 지키기 위해서 락을 사용합니다.
락은 트랜잭션 처리의 순차성을 보장하기 위한 방법입니다.
Lock의 범위 (Level)
DB에는 Lock이 걸리는 범위를 설정할 수 있습니다. 모두 아래와 같습니다.
- 데이터 베이스 : 전체 DB에 락을 설정하고 거의 사용되지 않습니다. 주요 DB 업데이트에 사용됩니다. (DB 소프트웨어 버전 업그레이드)
- 파일 : 테이블, 로우 등의 실제 데이터가 쓰여지는 물리적인 저장소에 락을 설정하고 잘 사용되지 않습니다.
- 테이블 : 테이블에 락을 설정하고 주로 DDL 구문과 같이 전체 테이블에 영향을 주는 변경을 수행 시 유용합니다.
- 페이지와 블록 : 페이지와 블록에 락을 설정하고 잘 사용되지 않습니다.
- 컬럼 : 컬럼에 락을 설정하고 락 설정 및 해제에 대한 리소스가 많이 들어서 지원하는 DBMS가 많지 않습니다.
- 로우 : 로우에 락을 설정하고 가장 일반적으로 사용하는 락입니다. DML에 대한 Lock입니다.
Lock의 종류
DB에는 아래 4가지 Lock이 존재합니다.
- Shared Lock
- Exclusive Lock
- Update Lock
- Intent Lock
Shared Lock
공유 락은 읽기 명령에 대해 주어지는 락으로 Read Lock으로 불리며 앞 글자를 따서 주로 S로 표기됩니다.
여러 사용자들이 동시에 데이터를 읽어도 데이터 일관성에 아무런 문제가 없기에 공유 락끼리의 동시 접근을 허용합니다.
하지만 공유 락이 설정된 데이터에 베타 락을 사용할 순 없습니다.
Exclusive Lock
베타 락은 데이터 변경(쓰기)에 대해 주어지는 락으로 Write Lock으로 불리며 주로 X로 표기됩니다.
공유 락과는 다르게 해당 자원으로의 다른 세션의 접근을 막습니다. 베타 락은 트랜잭션 동안 유지됩니다.
Update Lock
업데이트 락은 수정을 위해 베타 락을 걸기 전에 Conversion Deadlock을 방지하기 위해 사용하는 락입니다.
UPDATE 쿼리의 WHERE 절에서 읽기 과정이 발생하고 그 후에 쓰기 과정이 발생하게 되는데 이 과정에서 데드락이 발생할 수 있습니다.
예를 들어서, 두 개의 세션이 있다고 가정하겠습니다. 두 세션이 동시에 UPDATE 쿼리를 던져서 서로 읽기 과정에서 공유 락을 얻고 베타 락으로 전환하려고 할 때 서로가 가지고 있는 공유 락이 잡힌 데이터로 접근하려고 한다고 생각하면 공유 락 때문에 데드락이 발생할 수 있습니다.
이런 부분들을 방지하기 위해서 사용이 되고 일부 SELECT 쿼리에서도 해당 락을 적용하기도 합니다.
Intent Lock
내재 락은 사용자가 요청한 범위에 락을 걸 수 있는지에 대한 유무를 파악하기 위해 사용하는 락으로 공유 락과 베타 락 앞에 I 기호를 붙여서 IS, IX, SIX 등으로 표현됩니다.
A 테이블의 로우에 대해서 락이 걸려있는 경우에 다른 세션에서 A 테이블 전체에 대한 락을 걸기를 원한다면 로우에 대한 락이 끝날 때까지 기다려야 합니다.
하지만 테이블에 락을 걸 수 있는지 여부를 파악할 수 있다면 기다리지 않아도 괜찮습니다. 이를 위해서 Intent Lock이 사용됩니다.
※ 이런 락을 걸 때 주의 해야할 부분이 데드락입니다. 앞에서도 나왔듯이 락을 거는 접근의 순서가 반대인 경우에 교착상태가 발생할 가능성이 증가합니다. 그래서 이를 줄이기 위해서는 접근 순서를 똑같이 가져가는 것이 중요합니다.
마무리
DB에 대해서 너무 지식이 부족하다고 느껴져서 당장 공부해야겠다고 느꼈던 락부터 공부를 해봤습니다.
이전에 락에 대해서 공부할 때는 진짜 이해도 되지 않고 뭔말이지 했는데 경험을 하고 다시 보니까 머리 속에 오랫동안 남을 것 같다는 생각이 들었습니다.
Reference
https://sewonzzang.tistory.com/76
'몰랐던거 > DB' 카테고리의 다른 글
[Transaction] 트랜잭션과 트랜잭션 격리성 공부하기 (2) | 2023.04.11 |
---|---|
인덱스 (index) (0) | 2022.11.30 |
DBMS의 종류, DB 서버 (0) | 2022.08.31 |
데이터베이스의 개념 (0) | 2022.08.31 |
DDL, DML, DCL 이란? (0) | 2022.08.25 |