[데이터 베이스] Lock 에 대해 알아보자.
목차
- Lock?
- Lock의 종류
- Lock의 범위
- 교착상태
- 블로킹
1.Lock?
데이터 베이스에서의 Lock은 다수의 사용자 또는 프로세스가 동시에 데이터베이스의 일부를 접근하려고 할 때 발생할 수 있는 충돌을 방지하기 위해서 사용됩니다. Lock을 사용하게 됨으로써 데이터의 무결성과 일관성 그리고 트랜잭션의 순차성을 보장받을 수 있습니다.
2.Lock의 종류
데이터베이스 락은 크게 공유 락(Shared Lock)과 배타적 락(Exclusive Lock)으로 나눌 수 있습니다.
공유 락(Shared Lock)
- 다수의 트랜잭션이 동시에 동일한 데이터를 읽을 수 있게 하는 락
- 여러 사용자가 동시에 데이터를 읽을 수 있지만, 쓰기 작업은 허용되지 않습니다.
- 공유 락을 획득한 트랜잭션은 데이터를 읽을 수 있지만, 해당 데이터에 대한 변경 또는 쓰기 작업은 다른 트랜잭션이 쓰기 락을 획득하지 않는 이상 허용되지 않습니다.
배타적 락(Exclusive Lock)
- 특정 트랜잭션이 데이터를 읽거나 쓸 때, 다른 어떤 트랜잭션이 해당 데이터에 대한 접근을 허용하지 않는 락
- 배타적 락을 획득한 트랜잭션은 해당 데이터에 대한 쓰기 작업을 수행할 수 있습니다. 그러나 다른 어떤 트랜잭션도 해당 데이터를 읽거나 쓸 수 없습니다.
- 쓰기 작업을 수행하는 동안 배타적 락은 데이터의 일관성을 보장합니다. 여러 트랜잭션이 동시에 동일한 데이터를 변경하는 경우, 배타적 락은 충돌을 방지하여 데이터 일관성을 유지합니다.
3.Lock의 위
DB에는 Lock이 걸리는 범위를 설정할 수 있습니다.
테이블 락(Table-level Lock)
- 특정 테이블에 대한 락을 설정하는 것입니다.
- 해당 테이블의 모든 레코드에 대한 접근을 제어합니다.
- 다수의 트랜잭션이 특정 테이블에 동시에 접근하는 경우에 사용됩니다.
페이지 락(Page-level Lock)
- 데이터베이스의 페이지라 불리는 블록 단위로 락을 설정합니다.
- 페이지는 일반적으로 여러 레코드를 포함하고 있습니다.
- 페이지 레벨 락은 해당 페이지에 속한 모든 레코드에 대한 접근을 제어합니다.
로우 락(Row-level Lock)
- 데이터베이스의 각 레코드(로우)에 대한 락을 설정합니다.
- 가장 세밀한 락의 범위로, 특정 레코드에 대한 접근을 제어합니다.
- 다수의 트랜잭션이 동시에 동일한 테이블에서 서로 다른 로우에 접근할 때 사용됩니다.
필드 또는 컬럼 락(Field or Column-level Lock):
- 특정 필드 또는 컬럼에 대한 락을 설정하는 것입니다.
- 일반적으로는 로우 레벨 락이나 페이지 레벨 락을 사용하는 것이 더 효율적이므로, 필드 레벨 락은 드물게 사용됩니다.
4.교착상태
교착상태(Deadlock)는 다수의 프로세스나 스레드가 서로가 가진 자원을 기다리면서 무한히 대기하는 상태를 말합니다.
교착상태가 되는 조건은 다음과 같습니다.
- 상호 배제(Mutual Exclusion): 자원은 동시에 여러 프로세스에 의해 사용될 수 없습니다. 즉, 한 번에 하나의 프로세스만이 자원을 사용할 수 있어야 합니다.
- 보유 및 대기(Hold and Wait): 프로세스가 이미 보유한 자원을 가지고 있으면서 동시에 다른 자원을 기다리고 있어야 합니다.
- 비선점(No Preemption): 다른 프로세스가 이미 보유한 자원을 선점할 수 없어야 합니다. 다른 프로세스가 해당 자원을 사용할 수 있는 경우, 보유 중인 프로세스는 자원을 반납하고 대기해야 합니다.
- 환형 대기(Circular Wait): 프로세스 집합에서 원형 형태로 자원을 기다리고 있는 상태여야 합니다. 즉, 프로세스 P1이 프로세스 P2가 가진 자원을 기다리고, P2가 P3가 가진 자원을 기다리며, P3가 P1이 가진 자원을 기다리는 상황이어야 합니다.
5.블로킹
블로킹은 Lock간(베타 - 베타, 베타 - 공유)의 경합이 발생하여 특정 Transaction이 작업을 진행하지 못하고 멈춰선 상태를 말합니다. 공유락 끼리는 블로킹이 발생하지 않지만 베타락은 블로킹을 발생시킵니다. 블로킹을 해소하기 위해서는 이전의 트랜잭션이 완료(커밋 OR 롤백)되어야 합니다. 뒤에 들어온 트랜잭션은 이전 트랜잭션이 마무리되어야 이후 진행이 가능합니다. 이런 경합은 성능에 좋지 않은 영향을 미칩니다.
참고
https://blog.trustedtechteam.com/2020-12-29-sql-deadlocks-why-they-happen-how-to-avoid-them/
SQL Deadlocks: Why They Happen & How To Avoid Them
In SQL Server, a deadlock happens when two processes are waiting on the other to issue a locked resource. This performance issue occurs when…
blog.trustedtechteam.com
https://www.geeksforgeeks.org/deadlock-in-dbms/
Deadlock in DBMS - GeeksforGeeks
A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.
www.geeksforgeeks.org
Techniques to identify blocking queries and other causes of SQL Server blocks
Blocked processes caused by locks on database objects are a common issue. Locking ensures the integrity of data stored within databases by forcing each executed SQL Server transaction to pass the ACID test. which considers that every transaction must meet
solutioncenter.apexsql.com