소피it블로그
[DB] 트랜잭션(Transaction) 본문
1. 트랜잭션
DB에서 하나의 논리적 기능을 수행하기 위한 작업의 단위. 하나의 트랜잭션은 커밋되거나 롤백되어야 한다.
- 커밋(commit): 하나의 트랜잭션이 문제 없이 처리되어 데이터베이스가 다시 일관된 상태에 있을 때, 변경된 내용을 모두 영구적으로 저장하는 연산
- 롤백(rollback): 하나의 트랜잭션 처리가 비정상적으로 끝나 데이터베이스의 일관성이 깨졌을 때, 모든 연산을 취소하여 트랜잭션 이전의 상태로 돌리는 것.
2. 트랜잭션의 특성(ACID)
- 원자성(Atomicity): all or nothing, 트랜잭션과 관련된 모든 연산은 전부 정상적으로 수행 완료되거나 아무런 연산도 수행되지 않아야 한다.
- 일관성(Consistency): 트랜잭션이 끝난 후에도 데이터베이스가 일관된 상태로 유지되어야 한다.
- 독립성(Isolation): 하나의 트랜잭션이 다른 트랜잭션의 수행에 끼어들 수 없다.
- 지속성(Durability): 성공적으로 수행된 트랜잭션은 영구적으로 반영되어야 한다.
3. 격리 수준
isolation level | dirty read | non-repeatable read | phantom read |
read uncommited | O | O | O |
read commited | - | O | O |
repeatable read | - | - | O |
serializable | - | - | - |
- 격리 수준: 낮은 레벨일수록 동시성이 증가하지만 무결성에 문제가 생기며, 높은 레벨일수록 무결성은 유지할 수 있으나 동시성이 저하되며 비용이 증가한다.
- read uncommited(레벨 0): 가장 낮은 격리 수준. 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용한다. 따라서 가장 빠르지만, DB의 일관성 유지가 어려워진다.
- read commited(레벨 1): 가장 많이 사용되는 격리 수준으로, MySQL, Oracle 등에서 기본값. 커밋이 완료된 데이터에 대해서만 "조회"를 허용. 어떤 트랜잭션이 접근한 행을 다른 트랜잭션이 "수정"할 수 있다.
- repeatable read(레벨 2): 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 "수정"할 수 없도록 막아줌으로써 트랜잭션 범위 내에서 조회한 데이터의 내용이 항상 동일함을 보장. 새로운 행을 "추가"하는 것은 막지 않는다.
- serializable(레벨 3): 트랜잭션을 순차적으로 진행시키기 때문에 여러 트랜잭션이 동시에 같은 행에 접근할 수 없다. 다른 사용자의 "수정", "입력"이 불가능하다.
- 격리 수준에 따라 발생하는 현상
- dirty read: 수정되었으나 커밋되지 않은 데이터를 다른 트랜잭션에서 읽을 수 있을 때 발생한다.
- non-repeatable read: 한 트랜잭션 내에서 같은 쿼리를 두 번 이상 조회하였는데 그 사이 다른 트랜잭션이 값을 수정 또는 삭제하여 결괏값이 다른 경우.
- phantom read: 한 트랜잭션 내에서 레코드를 두 번 이상 조회할 때 첫 번째 쿼리에서 없던 레코드가 두 번째 쿼리에서 나타나는 현상으로, 트랜잭션 도중 새로운 레코드의 삽입을 허용하기 때문에 발생함.
참고 자료:
https://github.com/WeareSoft/tech-interview/blob/master/contents/db.md#4-database
'CS > 데이터베이스' 카테고리의 다른 글
[DB] 조인(Join) (0) | 2022.11.13 |
---|---|
[DB] 정규화(Normalization) (0) | 2022.11.13 |
[DB] 인덱스(Index) (0) | 2022.11.13 |
[DB] 데이터베이스 기본 (0) | 2022.11.13 |
[SQL] 프로그래머스 SQL 고득점 Kit -String, Date (MySQL) (0) | 2022.11.04 |