-
[DB] ACID란? Transaction이란?Spring Boot/DB 2023. 6. 28. 11:22
ACID는 DB 트랜잭션의 안정성 보장을 위해 필요한 성질을 정리한 것.
원자성, 고립, 일관성, 영구성으로 트랜잭션을 제어하기 위해서 알아야한다.
0. Transaction은 무엇인가
- One unit of work에서의 쿼리 집합이다.
- 즉 서버로 치면 connection을 기준으로 하나의 트랜잭션으로 구분한다.
- 쿼리 1개로 비즈니스 로직을 수행하지 못한다. 하여 쿼리 집합이 필요하고 집합을 트랜잭션으로 구분한다.
- ex) 예금 이체 (SELECT, UPDATE, UPDATE 3개가 필요)
- 트랜젝션의 Life span
- Transaction BEGIN
- Transaction COMMIT
- Transaction ROLLBACK
- 트랜젝션의 2가지 성격
- 변경, 수정을 위한 트랜잭션
- readonly 트랜잭션
- 트랜잭션은 모든 요청에 항상 실행된다.
1. Atomicity (원자성)
- 원자성
- 원자(原子, atom)는 일상적인 물질을 이루는 가장 작은 단위이다. 일상적인 물질들이 원소로 구성되어 있기 때문에, 이는 화학 반응을 통해 더 쪼갤 수 없는 단위
- 즉 트랜잭션은 쪼갤 수 없다는 것을 뜻한다.
- 하나의 트랜잭션 안에 모든 쿼리는 전부 성공해야한다.
- 하나의 트랜잭션 안에서 단 하나의 쿼리라도 실패하면 ROLLBACK
2. Isolation (격리)
- Multiple Transaction이 발생 READ vs UPDATE
- 읽기 트랜잭션에서 다른 트랜잭션의 업데이트 내용을 알아야할까?
- Read Phenomena (읽기 이상 현상)
- 다른 트랜잭션의 영향을 받아 읽어온 데이터가 이상한 현상을 뜻한다.
- Dirty reads
- ex. 다른 트랜잭션의 commit전 데이터 변경을 읽는 경우
- Non-repeatable reads
- 트랜잭션 중간에 다른 트랜잭션의 commit 변경 사항을 읽어서 읽는 데이터가 정합성 보장 안되는 경우
- Phantom reads
- 트랜잭션 중간에 다른 트랜잭션에서 insert한 데이터를 읽은 경우
- Lost updates
- 업데이트 하는 트랜잭션 중간에 다른 트랜잭션 변경한 것을 읽은 경우
- Dirty reads
- Read Phenomena은 트랜잭션 격리로 방지할 수 있다. (단 성능과 Trade off 관계)
- Isolation Levels
- 격리 레벨
- READ_UNCOMMITTED : No Isolation, Dirty Read 발생, 그러나 가장 빠르다.
- READ_COMMITTED : 트랜잭션이 다른 트랜잭션이 커밋된 결과만 읽는다. 트랜잭션 중간에도 다른 트랜잭션의 커밋 결과를 읽는다. (데드락 예방에 권장 https://jsonobject.tistory.com/427)
- REPEATABLE_READ : 트랜잭션 중 읽는 데이터에 변경이 없는 것을 보장. 그러나 Phantom read는 방지하지 못한다. 또한 READ_COMMITED에 비해서 느리다.
- SNAPSHOT : 트랜잭션 시작 시점의 데이터 보장. Read Phenomena를 제거 될 것을 보장한다.
- SERIALIZABLE : 트랜잭션의 동시성 포기, 다중 트랜잭선을 순서대로 실행
- 격리 레벨
- RDBMS 마다 isolation 구현 방식이 다르다.
- 격리 방식
- Pessimistic : Row level Lock, table Lock, page locks to avoid lost updates (비용이 너무 비싸다)
- Optimistic : No locks, version으로 관리, 그러나 개발시 작업이 많아진다.
3. Consistency
데이터의 일관성
- (DB 데이터의 일관성) Consistency in Data
- (DB 읽기에 일관성) Consistency in reads
4. Durability
- 컴퓨터에 장애가 나도 휘발하지 않는 저장소 보장
- Durability 관련 기술
- WAL : write ahead log
- OS Cache
- Asynchronous snapshot
- AOF
Reference
위키피디아, 최범균님 유튜브, 지단 로보트님 블로그 참고
https://en.wikipedia.org/wiki/Isolation_(database_systems)
https://www.youtube.com/watch?v=urpF7jwVNWs
반응형'Spring Boot > DB' 카테고리의 다른 글
DB Replication이란? 사용 이유 (0) 2024.03.19 [DB] UUID를 고유 값이나 Key로 사용하면 안되는 이유 (0) 2023.06.30 [M1 Mac] Mysql 명령어 정리 (+ docker로 설치) (0) 2023.06.27 [SQL] Or 와 In 조건 뭐가 더 좋을까? SELECT OR vs IN, which is better performance. (0) 2022.07.15 Flyway로 데이터베이스 마이그레이션 해보자 (이론편) (0) 2022.07.14