상세 컨텐츠

본문 제목

[DB] 데이터베이스 Lock이란?

카테고리 없음

by choiDev 2024. 1. 21. 15:29

본문

Lock이란?

여러 사용자가 동시에 데이터베이스에 접근하는 상황에서 데이터 일관성을 보장하기 위해 사용하는 메커니즘

 

Lock의 종류 설명
공유 락(Shared Lock) 리소스를 다른 사용자가 동시에 read는 가능하지만 변경은 불가하게 하는 락입니다

공유락이 걸린 데이터에 대해서 다른 트랜잭션도 똑같이 공유락을 획득 가능하나 배타적락은 획득이 불가능합니다. 

공유락을 사용하면 조회한 데이터가 트랜잭션 내내 변경되지 않음을 보장합니다.


배타적락(Exclusive Lock) 데이터 (Insert, Update, Delete)등의 쓰기 작업을 위해 사용되며, 한번에 하나의 사용자만이 쓰기 작업을 수행할수 있도록 Lock을 걸어줍니다.

다른 트랜잭션들이 해당 데이터에 대한 읽기 또는 쓰기 락을 설정할 수 없습니다.

배타적 락을 사용할때는 Dead Lock이 발생할수 있습니다. Dead Lock은 2개 이상의 트랜잭션이 서로의 락을 대기하고 있는 상황을 말하며 서로 점유하고 있는 데이터를 가진상태에서 서로의 데이터를 새롭게 원하게 되면 둘은 락을 획득할수도 락을 해제할수도 없는 상화엥 빠지게 됩니다.
레코드락(Record Lock) Record를 기준으로 Lock을 겁니다. 

예시로 Select문이 실행되면 Shared Lock이 대상 Record 기준으로 걸리며 해당 Record는 Write 구문 사용이 불가능해집니다.

 

 

Transaction Isolation Level(트랜잭션 격리 레벨)

격리성이란 실행중인 트랜잭션의 끝나지 않았다면 다른 트랜잭션에서는 해당 데이터에 접근할 수 없음을 나타냅니다.

 

READ UNCOMMITTED
(커밋되지 않은 읽기)
- 가장 낮은 격리 수준
- 다른 트랜잭션이 수행중인 변경 사항을 볼 수 있습니다.
- Dirty Read, Non-repeatable Read, Phantom Read 문제가 발생할 수 있습니다.
- 해당 격리 레벨을 사용하는 것은 일반적으로 권장되지 않습니다.
READ COMMITTED
(커밋된 읽기)
- 트랜잭션이 커밋된 데이터만 읽을 수 있습니다.
- Dirty Read는 방지하지만 Non-repeatable Read, Phantom Read 문제는 여전히 발생할 수 있습니다.
REPEATABLE READ
(반복 가능한 읽기)
- 같은 쿼리를 반복해도 항상 동일한 결과를 보장합니다.
- Dirty Read와 Non-repeatable Read는 방지하지만 Phantom Read문제는 여전히 발생가능합니다. 
- Mysql의 기본 격리 레벨입니다.
SERIALIZABLE
(직렬화)
- 가장 높은 격리 수준으로 트랜잭션간에 상호 배타적인 락을 사용하여 Phantom Read 문제까지 방지합니다.
- 성능 저하가 있으므로 주의하여 사용해야합니다.
무슨 단어에요?

Dirty Read(더티 리드)
- 한 트랜잭션이 아직 커밋되지 않은 다른 트랜잭션의 변경 내용을 읽는 상황을 일컫는 말


Non-repeatable Read(비반복 가능한 읽기) 
- 한 트랜잭션이 같은 쿼리를 2번 실행했을 때 결과가 달라지는 상황을 의미합니다.
- 예시로 트랜잭션 A가 특정행을 읽은후 트랜잭션이 종료 되지 않은 상태에서, 다른 트랜잭션 B가 해당 행을 수정하고 커밋했을때 트랜잭션 A가 다시 같은 쿼리를 실행하면 다른 결과를 얻게 됩니다.
- 해당 이슈는 데이터의 무결성을 해치게 됩니다.
- 락을 사용하거나 격리레벨을 격상시켜 해소가 가능합니다.


Phantom Read(팬텀리드)
- 한 트랜잭션이 동일한 쿼리를 두번 실행했을때 결과 행이 달라지는 상황을 나타냅니다.
- 예시로 트랜잭션 A가 특정 조건을 만족하는 행을 읽고 트랜잭션이 종료되지 않은 상태로, 트랜잭션 B가 새로운 행을 삽입하면 기존에 10개의 행이 였던게 11개의 행으로 조회되는 현상입니다.