SQL (30) - 대기와 락
이전의 포스트에서 SQL에서도 마찬가지로 멀티 스레드 방식을 사용하는 것을 알아보았습니다.
따라서 LOCK을 사용하여 멀티 스레드의 위험성을 최대한 낮추는 것 역시 동일하게 적용됩니다.
그러므로 오늘은 SQL에서의 대기와 락이 어떻게 구성되어 있고 어떻게 이뤄지는지 알아보겠습니다.
1) Lock의 종류
1 - 1) 상호배타적인 Lock
일반적인 Lock인 상호배타적인 Lock은
하나의 스레드가 자원을 점유하는 동안 다른 스레드들의 접근을 완전히 막습니다.
그러나 상호배타적인 Lock은 자원에 대한 원자성을 보장할 수는 있지만,
모든 작업에 대해 원자성을 보장하게 되어 원자성이 필요없는 작업의 속도도 늦춘다는 단점이 있습니다.
1 - 2) Reader - Writer Lock
위의 상호배타적인 Lock의 단점에 대응하고자 사용하는 Read -Write Lock입니다.
일반적인 데이터를 읽어오는(=가져오는) Read 연산에 대해서는 Lock을 따로 사용하지 않지만,
데이터를 추가 / 수정 / 삭제하는 Write 연산에 대해서는 Lock을 사용합니다.
위 락의 장점은 평상시에는 Reader 락을 사용하고, 특별한 경우에만 Writer 락을 사용하여
락의 이점과 작업 속도 모두를 챙길 수 있다는 것입니다.
SQL에서의 Reader - Writer 락은 다음과 같이 구성되어 있습니다.
- Shared 락 : 일반적인 상태를 의미하는 Reader Lock
- Exclusive 락 : DML에 해당하는 INSERT, UPDATE, DELETE에서 사용하는 Write Lock
- Update 락 : Shared 락(Read) - Exclusive 락(Write)의 중간 단계(Update)에서 사용하는 락
이때 Lock이 걸려있는 자원에 대해 각 Lock은 다음의 방식으로 동작합니다.
- Shared 락 - Shared는 통과 / Update는 통과 / Exclusive는 통과 못함
- Exclusive 락 - Shared는 통과 / Update는 통과 못함 / Exclusive는 통과 못함
- Update 락 - Shared는 통과 못함 / Update는 통과 못함 / Exclusive는 통과 못함
결론적으로 Write 연산이 이뤄지는 쿼리에 대해서만 상호배타적 Lock이 적용된다고 이해하면 되겠습니다.
2) Lock의 적용 범위
SQL에서 Lock을 적용할 수 있는 범위는 다음과 같습니다.
- Row
- Page
- INDEX
- Table
- DataBase
위와 같은 적용 범위에서
Row에서 DataBase로 갈수록, 자원의 소모가 덜하고
DataBase에서 Row로 갈수록, Lock의 범위가 작아 병렬처리에서의 이점을 볼 수 있습니다.
3) DeadLock
Lock을 사용하게 되면 반드시 마주치는 Dead Lock 문제 역시, SQL에서 발생하게 됩니다.
하지만 다른 경우와 다르게 무한히 대기하지 않고, 한쪽에서 Rollback하여 해결할 수 있습니다.