트랜잭션이란 애플리케이션에서 몇 개의 읽기와 쓰기를 하나의 논리적 단위
로 묶는 방법이다. 개념적으로 한 트랜잭션 내의 모든 읽기와 쓰기는 한 연산으로 실행된다.
트랜잭션의 핵심은 일련의 작업 도중 오류가 생기면 취소(abort, rollback)되고, 안전하제 재시도 할 수 있다는 것이다.
트랜잭션은 전체가 성공(commit)하거나 실패(abort, rollback)하므로 트랜잭션이 실패하면 애플리케이션에서 안전하게 재시도 할 수 있다. 즉, 트랜잭션 덕분에 부분적인 실패를 걱정할 필요가 없으므로 애플리케이션에서 오류를 처리하기 훨씬 쉬워진다.
ACID
트랜잭션은 ACID
속성을 가진다.
Atomicity - 원자성
여러 작업이 하나의 원자적인 트랜잭션으로 묶여있다. 트랜잭션 도중 어떠한 결함으로 인해 완료될 수 없다면 지금까지 실행한 작업을 무시하거나 취소해야 한다.
트랜잭션은 성공적으로 수행되면 commit
되고, 하나라도 실패할 경우 abort
혹은 rollback
된다.
Consistencty - 일관성
트랜잭션은 데이터베이스 내부의 일관성을 지켜야 한다. 각 트랜잭션은 일관성을 보장하도록 프로그램을 작성한다.
Isolaction - 격리성
동시에 실행되는 트랜잭션은 서로 격리된 상태로, 트랜잭션은 다른 트랜잭션을 간섭 혹은 방해할 수 없다.
Durability - 지속성
트랜잭션이 성공적으로 커밋됐다면 하드웨어 결함이 발생하거나 데이터베이스가 죽더라도 트랜잭션에서 기록한 모든 데이터는 손실되지 않는다.
동시성 문제
동시성 문제는 트랜잭션이 다른 트랜잭션에서 동시에 변경한 데이터를 읽거나 두 트랜잭션이 동시에 같은 데이터를 변경하려고 할 때 나타나는 문제다.
이러한 동시성 문제는 트랜잭션 격리
를 통해 해결할 수 있다. 일반적으로 트랜잭션 격리 수준은 네 가지로 나뉜다.
READ UNCOMMITED
- 커밋되지 않은 읽기- dirty read 가능
READ COMMITED
- 커밋된 읽기- dirty read 불가
- 타이밍에 따라 데이터가 달라짐
REPEATABLE READ
- 반복 가능한 읽기- 트랜잭션 내 모든 쿼리가 동일한 스냅샷의 데이터를 사용
- 보통 MVCC(Multi-Version Concurrency Control)로 구현
SEARIALIZABLE
- 직렬화 가능- 동시성 문제를 거의 해결할 수 있으나 성능상의 문제로 거의 사용하지 않음
참고로 SQL 표준에서 지정한 기본 격리 수준은 SEARIALIZABLE
이며, MySQL InnoDB의 기본 격리 수준은 REPEATABLE READ
다.
'STUDY > DATABASE' 카테고리의 다른 글
MySQL | load data infile ERROR (0) | 2021.04.13 |
---|---|
MySQL | export DDL (0) | 2021.04.09 |
MySQL | Unable to load authentication plugin 'caching_sha2_password' (0) | 2020.12.16 |
MySQL | 날짜 비교 ( where 오늘 / 이번 달 등) (0) | 2020.12.08 |
MySQL | Unknown collation: 'utf8mb4_0900_ai_ci' (0) | 2020.10.26 |