siino's 개발톡

[DB]트랜잭션/Lock/MVCC 정리 본문

데이터베이스

[DB]트랜잭션/Lock/MVCC 정리

siino 2024. 2. 5. 13:55

트랜잭션이 무엇인가요?

트랜잭션은 더 이상 분리할 수 없는 논리적인 작업을 의미합니다.

 

트랜잭션의 4가지 원칙을 알려주세요

ACID

Atomic: All or Nothing의 개념. 트랜잭션이 성공하여 내부의 작업들이 전부 성공하거나 전부 다 실패함을 의미합니다.

Consistency: DB의 제약사항을 위반하지 않는다는 원칙.

Isolation: 여러개의 트랜잭션이 수행될 때 각각의 트랜잭션은 독립적으로 수행됨을 의미.

Durability: 트랜잭션이 커밋되면 해당 작업은 영구적으로 DB에 반영됨을 의미.

 

트랜잭션의 특징 중 isolation을 만족하기 위해선 어떻게 해야할까요?

트랜잭션의 일련의 작업들이 Serializable과 Recoverable을 만족해야한다.

 

Serializable과 Recoverable을 만족할 수 있는 방법에 대해서 설명해주세요

Serializable을 만족하기 위해서는 해당 스케쥴이 serial 스케쥴과 conflic equivalent함을 의미한다.

Recoverable을 만족하기 위해서는 데이터가 수정될 때 해당 데이터를 수정한 트랜잭션이 커밋하기 전에는 해당 데이터를 읽은 트랜잭션이 커밋되어서는 안된다.

 

Lock에 대해서 설명해주세요.

트랜잭션의 동시성을 제어하기 위한 매커니즘으로 shared lock(read lock)과 exclusive lock(write lock)이 있다.

읽기/쓰기작업을 위해서는 해당 잠금을 획득해야한다.

해당 잠금을 획득하면 다른 트랜잭션은 동일 데이터에 대해서 작업을 수행할 수 없다.(block)

 

Isolation의 수준을 개발자가 정할 수 있는데 4가지 격리 수준에 대해 설명해주세요.

READ-UNCOMMITTED: 커밋되지 않은 데이터를 다른 트랜잭션에서 볼 수 있는 격리 수준.

READ-COMMITTED: 커밋된 데이터를 다른 트랜잭션에서 볼 수 있는 격리 수준. 

REPEATABLE-READ: 동일 트랜잭션 내에서 일관된 읽기를 보장하는 격리 수준.

SERIALIZABLE: 어떤 이상현상도 발생하지 않는 가장 강력한 격리 수준.

 

각각의 이상현상에 대해 간략히 설명해주세요.

dirty read: 변경된 커밋 되지 않은 데이터를 읽어 작업을 처리했는데 해당 데이터가 rollback 되는 경우.

unrepeatable read: 동일 트랜잭션 내에서 데이터 읽는 작업을 2번 시행했을때 값이 달라지는 경우.(update)

phantom read: 동일 트랜잭션 내에서 데이터를 읽는 작업을 2번 시행했을 때 새로운 값이 생기는 경우.(insert)

 

Serializable를 만족하면서 동시성을 높일 수 있는 방법에 대해서 설명해주세요.

MVCC

 

MVCC에 대해서 설명해주세요.

데이터의 여러 버전을 유지하면서 shared-lock을 걸지 않고 snap shot형태로 데이터를 읽어 read-write간의 작업 동시성을 높일 수 있는 매커니즘.

 

Mysql의 innoDB는 MVCC를 어떻게 구현하고 있나요?

각 행에 히든 컬럼을 추가하여 MVCC를 구현한다. 히든컬럼은 트랜잭션 ID와 롤백 포인터를 포함한다.

변경사항을 DB에 바로 반영하지 않고 버퍼풀에 결과를 임시저장하고, 언두로그에 이전 데이터를 저장하여 롤백하거나 다른트랜잭션이 데이터를 읽어야할 때 활용한다.

Read view라는 매커니즘을 사용하여 데이터를 읽을 때 해당 트랜잭션 격리수준에 맞춰 시작시점/최근 커밋시점

등을 view를 제공한다.

 

 

Mysql innoDB는 Durability를 만족하기 위해서 어떻게 하나요?

트랜잭션 동안의 DML명령이 실행되면 변경사항은 메모리 내의 버퍼(Buffer pool)에 임시 저장된다. 이는 데이터의 실제 쓰기 작업을 최적화하고 디스크 I/O 비용을 줄인다.

COMMIT 명령이 실행되면 메모리 로그 버퍼에 저장된 변경사항을 디스크 로그파일(Redo Log)로 쓰기 시작한다. 이 과정을 WAL(Write-Ahead-Logging)이라 하며 데이터의 영속성을 보장하기 위한 단계이다.

로그파일에 변경사항이 성공적으로 기록되면 데이터파일에 실제로 반영한다.

시스템 장애 발생 시, Redo Log를 사용하여 데이터를 복구할 수 있도록 한다.

'데이터베이스' 카테고리의 다른 글

트랜잭션과 이상 현상을 직접 확인해보자!  (0) 2024.02.01