공부방
트랜잭션과 ACID 원칙 본문
트랜잭션이란?
- 데이터베이스에서 한 번에 처리돼야 할 작업 묶음
- 쉬운 예 : 자판기에 돈을 넣고 -> 음료 고르고 -> 음료 나오는 이 전체 과정이 하나의 트랜잭션
- 다 성공하거나 하나라도 실패하면 전부 취소해야한다.
- 은행에서 송금할 때 내 계좌에서 만원 출금, 친구 계좌에 만원 입금한다고하면 이게 한 트랜잭션
- 하나라도 실패하면 돈이 사라지거나, 중복되면 안 되기 때문에 반드시 둘 다 성공하거나, 모두 취소(rollback) 해야한다.
Commit 연산
- 하나의 트랜잭션이 성공적으로 끝났고, 데이터베이스가 일관성 있는 상태에 있을 때, 하나의 트랜잭션이 끝났다 라는 것을 알려주기 위해 사용하는 연산
- Commit을 하면 수행했던 트랜잭션이 로그에 저장되며, 후에 Rollback 연산을 수행했었던 트랜잭션 단위로 하는 것을 도와준다.
Rollback 연산
- 하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션의 원자성이 깨진 경우, 트랜잭션을 처음부터 다시 시작하거나, 트랜잭션의 부분적으로만 연산된 결과를 다시 취소시킨다.
- 후에 사용자가 트랜잭션 처리된 단위대로 Rollback을 진행할 수도 있다.
트랜잭션의 작동 방식
- 트랜잭션 시작(Begin Transaction)
- 내가 하려는 작업 수행(계좌에서 돈 빼기, 넣기 등)
- 문제 없으면 -> 커밋(Commit)
이제 결과를 진짜 DB에 저장 - 문제 생기면 -> 롤백(Rollback)
아예 처음 상태로 돌려버림
트랜잭션 격리 수준(Isolation Level)
- 여러 사람이 동시에 데이터베이스를 건드릴 때 서로 꼬이지 않게 하는 방지 수준
- 예시
- 친구와 함께 1개 남은 라면을 동시에 사려고 한다.
- 내가 먼저 라면이 있는지 확인해보는 트랜잭션 시작
- 친구도 라면이 있는지 확인하는 트랜잭션 시작
- 둘 다 사면 재고가 꼬인다.
- 이런 상황을 막기 위해 '격리 수준'을 조절하는 것.
- READ UNCOMMITTED : 다른 사람이 아직 확정(커밋) 안 한 정보도 볼 수 있다. -> 제일 위험
- READ COMMITTED : 커밋된 정보만 볼 수 있다 (조금 안전)
- REPEATABLE READ : 한 번 읽은 데이터는 계속 똑같게 보인다. (일관성 유지)
- SERIALIZABLE : 완전 순차적으로 처리 -> 가장 안전하지만 느리다.
- 보통 READ COMMITTED, REPEATABLE READ 많이 쓴다.
트랜잭션에서 생기는 문제들
- Dirty Read(더러운 읽기) : 다른 사람이 아직 커밋도 안 한 값을 내가 읽어버림
- Non-Repeatable Read(반복 불가 읽기) : 읽었는데 다시 읽었더니 값이 바뀜
- Phantom Read(유령 읽기) : 조건은 같은데, 똑같은 쿼리인데 데이터가 늘어나 있다.
- 이 문제들은 Isolation Level로 막을 수 있다.
ACID 원칙이란?
트랜잭션이 제대로 작동하기 위한 4가지 규칙
A - 원자성(Atomicity)
- 트랜잭션은 모두 성공 또는 모두 실패 해야한다.
- 예 : 도시락을 쌀 때 반, 반찬, 김치 전부 넣어야 완성된 도시락이지만, 반찬을 다 빠뜨리게 되면 도시락이라고 하기 어렵다.
- 즉, 중간에 실패하면 모든 걸 취소
C - 일관성(Consistency)
- 트랜잭션이 끝나면 데이터는 항상 정해진 규칙(제약조건)을 만족해야 한다.
- 예 : 누군가에 계좌에 -5000원 이라는 금액은 있을 수 없다.
이처럼 트랜잭션이 끝났을 때 이상한 상태가 되면 안된다. - 모든 규칙을 지키는 상태로 유지
I - 고립성(Isolation)
- 동시에 여러 트랜잭션이 실행돼도 서로 간섭하면 안된다.
- 예 : 쇼핑몰에서 옷을 사고 있는데 동시에 다른 사람이 같은 옷을 구매하면, 재고 꼬임, 중복 주문이 발생할 수 있다.
- 즉, 트랜잭션은 자기 일 끝나기 전까진 다른 트랜잭션이 못 끼어들게 해야 한다.
D - 지속성(Durability)
- 트랜잭션이 성공하면, 결과는 절대 날아가지 않는다.
- 예 : 은행에서 10만원 송금 완료 후 갑자기 정전이 됐다?
=> 그래도 돈은 무조건 송금돼 있어야 한다. - 성공한 트랜잭션은 디스크에 안전하게 저장돼야 한다.
'백엔드 > DB' 카테고리의 다른 글
DB 인덱스의 동작 원리와 성능 개선 (0) | 2025.03.25 |
---|---|
DB 클러스터링 (0) | 2025.03.19 |
데이터 이중화 (0) | 2025.03.19 |
분산 데이터베이스(Distributed Database) (0) | 2025.03.19 |
Tibero (0) | 2025.03.19 |