🎯 1. 트랜잭션이란?
💡 데이터베이스의 상태를 변경시키기 위해 수행하는 작업 단위이다.
👉DB의 상태를 변경시킨다는 것은 INSERT, UPDATE, DELETE, SELECT SQL문을 실행하는 것이다!
이때, 작업 단위는 하나의 SQL문이 아닐 수 있다.
⚙️ 작업 단위 예시
사용자가 계좌에 입금을 진행한 후에 입금 후 금액을 보는 예시를 생각해보자.
설계 시 사용자가 금액을 입금하는 UPDATE -> 금액 조회 SELECT 문으로 설계할 것이다.
이때, 작업 단위는 금액을 입금하는 UPDATE -> 금액 조회 SELECT 문이다.
따라서 2개의 SQL문이 하나의 트랜잭션으로 구성되는 것이다.
이처럼 하나의 SQL이 아닌 여러 SQL문이 하나의 트랜잭션으로 구성될 수 있다.
🎯 2. 트랜잭션의 성질 : ACID
트랜잭션의 성질은 4가지로, 다음과 같다.
1. Atomicity(원자성)
2. Consistency(일관성)
3. Isolation(독립성,격리성)
4. Durablility(영속성,지속성)
네 가지 성질의 앞 글자를 따서, ACID 성질이라고 부른다.
하나씩 살펴보자.
🎯 2-1. Atomicity (원자성)
- 트랜잭션의 연산은 DB에 모두 반영되거나 모두 반영되지 않아야한다.
- 트랜잭션 내의 모든 명령은 반드시 수행되어야 하며, 하나라도 수행되지 않으면 트랜잭션이 취소되어야 한다.
트랜잭션은 사람이 설계한 논리적인 작업 단위이다.
트랜잭션 안의 명령 중에 오류가 발생했을 때 수행된 것만 반영된다면
하나의 트랜잭션을 구성한 의미가 없어진다.
따라서, 어느 하나라도 오류가 발생하면 모든 명령이 반영되지 않아야한다.
🎯 2-2. Consistency(일관성)
- 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다.
- 시스템이 가지고 있는 고정 요소는 트랜잭션 수행 전과 수행 후의 상태가 같아야한다.
👉 트랜잭션 전후의 상태가 Correct State여야한다!
Correct State는 도메인의 유효 범위, 무결성 제약 조건 등을 위배하지 않는 정상적인 상태를 의미한다.
⚙️ Consistency 예시
- 트랜잭션 전 데이터 타입이 정수형이었으면, 트랜잭션 후에도 정수형이어야한다.
- NOT NULL인 컬럼에 트랜잭션 후에 null 값이 들어가면 안된다.
🎯 2-3. Isolation(독립성,격리성)
- 둘 이상의 트랜잭션이 동시에 실행되고 있을 경우 어떤 하나의 트랜잭션이라도, 다른 트랜잭션의 연산에 끼어들 수 없다.
- 하나의 특정 트랜잭션이 완료될 때까지, 다른 트랜잭션이 특정 트랜잭션의 결과를 참조할 수 없다.
⚙️ Isolation 예시
사용자 A, B가 게시글 작성 버튼을 누르는 시점에 최근 글 번호가 10번이라고 하자.
사용자 A, B가 순차적으로 버튼을 눌렀을 때는 누른 순서대로 글 번호가 11번, 12번이 될 것이다.
하지만 사용자 A, B가 동시에 눌렀다면?
A, B의 게시글 번호가 둘 다 11번이 될 것이다.
이러한 상황을 막기 위해 DB는 Lock 기능을 제공해서 Isolation 특성을 지킨다.
Lock에 대해 대강 설명하자면, 선행 작업이 완료되기 전까지는 후속 작업이 Lock되는 느낌이다.
예시에서 A가 11번으로 작성되기 전까지, B의 작성은 Lock되는 것이다.
A가 11번으로 작성된 후 B가 12번으로 작성된다.
이렇게 함으로써, 하나의 트랜잭션이 다른 트랜잭션 연산에 끼어들지 않는 Isolation을 지킬 수 있다.
🎯 2-4. Durablility(영속성,지속성)
- 성공적으로 완료된 트랜잭션의 결과는 시스템이 고장나더라도 영구적으로 반영되어야 한다.
모든 트랜잭션은 로그로 남게 된다.
그래서 서비스 중단, 충돌 시에도 DB가 다시 시작될 때 이전 변경 로그를 참조해서
이전 트랜잭션 결과를 반영한다.
🎯 3. 트랜잭션의 Commit & Rollback
✅ 3-1. Commit
- 하나의 트랜잭션이 성공적으로 끝났음을 알려주기 위해 사용하는 연산
- Commit 연산이 수행되면 처리 과정이 DB에 영구 저장된다.
- Commit 연산 전에는 데이터 변경 이전 상태로 복구가 가능하다.
- Commit 연산 후에는 변경 사항이 DB에 반영되어 이전 데이터는 복구할 수 없다.
✅ 3-2. Rollback
- 데이터 변경 사항을 DB에 반영하지 않고 취소하여 데이터를 이전 상태로 복구하는 것이다.
- 변경 전 데이터를 undo segment에 따로 저장해 놓고, Rollback 명령어가 수행될 때 불러와서 복구한다.
- Rollback을 통해 트랜잭션의 Atomicity(원자성)을 구현할 수 있다.
요약하면, 여러 작업이 모두 마무리 되었다면
트랜잭션 Commit을 통해 작업이 마무리되었음을 DB에 알려주어 반영하고,
어떤 문제가 생겼다면 작업 취소를 위해 트랜잭션 Rollback 처리를 해줘야한다!
'DB' 카테고리의 다른 글
[DB] MySQL InnoDB의 인덱스(feat. 클러스터링 인덱스, 세컨더리 인덱스, 인덱스 스캔 종류, 다중 컬럼 인덱스) (1) | 2023.11.13 |
---|---|
[DB] DB 인덱스(Index)란? (1) | 2023.11.12 |
[DB] DB Lock이란? (feat. Lock 종류, 블로킹, 데드락) (0) | 2023.11.08 |
[DB] 트랜잭션 격리 수준 알아보기 (2) | 2023.09.29 |
[DB] 친구 테이블 ERD 설계, 친구 목록 조회 기능 구현(Querydsl 셀프 조인) (1) | 2023.02.01 |