일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |
- 표현 가능한 이진트리
- 실행과정
- 함께 자라기
- 멀티 스레드
- 트랜잭션
- MESI
- 멀티 코어
- MVCC
- 세그멘테이션
- 멀티 프로세스
- 자바
- 이펙티브자바
- 틱택토
- 이분탐색
- lis
- lv3
- 최장증가부분수열
- try-catch-finally
- 아키텍처 개선
- multi-thread
- Runtime data area
- java
- Parametric Search
- 프로그래머스
- synchronized
- 메모리계층구조
- 방문길이
- OS
- 캐시라인
- try-with-resource
- Today
- Total
siino's 개발톡
[DB]트랜잭션/Lock/MVCC 정리 본문
트랜잭션이 무엇인가요?
트랜잭션은 더 이상 분리할 수 없는 논리적인 작업을 의미합니다.
트랜잭션의 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 |
---|