🌚 부록
지난 시간에는 쓰레드와 캐시에 대해서 알아보았다. 데이터베이스도 마찬가지로 많이, 빠르게, 안전하게를 처리하기 위해 멀티쓰레드를 사용하고 있는 것을 알아보았고, 캐시를 통해 데이터를 저장하고 있다가 캐시가 꽉 찰경우 LRU 기법을 통해 캐시를 지워주는 등 캐시 관리기법에 대해서도 알아보았다. 오늘 또한 마찬가지로 실습이 아닌 이론을 통해 대기와 락에 대해서 알아보도록 하자.
🐱🐉 대기와 락
서버 프로그래머로 취업을 하기 위해서 데이터베이스에 대한 내용은 당연히 공부 하겠지만, 책을 살펴보면 락과 멀티쓰레드에 대한 얘기는 잘 없어 루키스님이 예전부터 궁금했던 부분 중 하나라고 하셨다. 곰곰히 생각해보면 전공시간에 데이터베이스를 배웠을 때에도 해당 내용은 딱히 배우지 않았던 것 같다.
사실 지금까지는 SSMS를 통해 단일 클라이언트를 통해서만 처리했었지만, 사실 데이터베이스의 3 요소 중 하나인 '많이'의 처리 전제조건은 다양한 커넥션을 통한 동시다발적인 요청일 것이다. 그렇다면 과연 '다중스레드에서 Select 혹은 Update를 동시에 작업하면 과연 멀티스레드에서 안전하게 다 처리가 될까?'를 이제 알아보도록 하자.
이전 시간을 복습해보면 클라이언트가 동시 다발적으로 물건 두개를 맡긴다면, 응대 직원은 임시 창고에 물건을 보관하고, 나중에 백그라운드에서 짐꾼들이 물류창고에 실제로 물건을 옮기는 작업을 한다. 그런데 하필이면 '아무곳에 보관하는게 아닌 지정된 위치에다가 물건을 보관해야 한다.' 라는 조건이 붙을 경우 두 직원이 동시에 같은 곳을 가면 불편하기 때문에 한 명이 먼저 들어가고, 그 이후에 다음 사람이 들어가는 식으로 협업을 해야한다. 이럴 때 사용하는 것이 락이였다. 즉 락이라는 것은 동시다발적으로 어떠한 행위가 일어나지 못하게 하는 것이다.
예전에 락은 비행기 화장실이라고 예를 들었었다. 한 번에 한명만 들어가고, 문을 잠그고 있으면 밖에 있는 사람은 안에 있는 사람이 나와서 자물쇠를 풀어주기 전까지는 아무도 못 들어가는 것 개념이었다. 이를 상호 베타적인 락이라고 학습했었다.
사실 락에는 상호 베타적인 락 말고 리더-라이터라는 락도 존재한다. 리더-라디터 락은 위 이미지와 같이 두 가지가 존재하는데 리더 락은 일반 등급의 사용자들이 동시다발적으로 사용하는 개념이며, 반대로 라이터 락은 VIP 사용자들이 상호 베타적인 락 처럼 들어가면 아무도 못들어 가는 락이다.
이 락을 사용하면 좋은 점으로는 '데이터가 변하지 않는다고 가정 할 경우' 상호 베타적인 락을 사용하기보단, 리더-라이더 락을 사용하여 평상시에는 리더 락을 이용하다가 정말 중요한 순간에만 라이터 락을 사용하여 성능의 이점을 가질 수 있다는 것이다.
락을 거는 것까지는 알겠다. 그렇다면 어떤 대상에게 걸어줘야 할까? Row에도 걸 수 있고, 페이지에도 걸 수 있고, 더 나아가 테이블, 데이터베이스까지에도 걸 수 있는데 이는 그때그때마다 달리 걸어줘야 한다.
Row에서 데이터베이스로 올라가면 올라갈수록 락을 걸어줘야 하는 범위가 늘어나 병렬적으로 처리가 안되고, 반대로 데이터베이스에서 Row로 내려갈 경우 락의 범위가 좁아지기 때문에 병렬 처리에 이점이 있지만, 자원 소모가 많아지는 문제가 있다. 예를 들어 500개, 5000개의 Row에 동시다발적으로 락을 걸 상황이 생긴다면 이렇게 될 경우 일일히 다 락을 걸 바엔 차라리 그 윗단인 페이지에 락을 걸어서 사용하는 것이 더 좋은 것이다.
마지막으로 데이터베이스에서도 데드락은 당연히 발생하는데, 이는 예전에 살펴본 개념이기에 해당 포스팅에서는 넘어가도록 한다. 😎
'공부 > 인프런 - Rookiss' 카테고리의 다른 글
Part 5-4-5. 부록 : Redis 맛보기 #1 (3) | 2024.07.23 |
---|---|
Part 5-4-4. 부록 : 트랜잭션 (3) | 2024.07.22 |
Part 5-4-2. 부록 : 쓰레드와 캐시 (2) | 2024.07.20 |
Part 5-4-1. 부록 : 데이터베이스 원리 (1) | 2024.07.19 |
Part 5-3-10. SQL 튜닝 : Sorting (1) | 2024.07.18 |