[Database] 트랜잭션, ACID 란?
트랜잭션 ?
- 데이터베이스의 논리적인 연산 단위
- 트랜잭션에는 하나 이상의 SQL 문장이 포함됨
- 트랜잭션은 밀접히 관련되어 분리될 수 없는 한 개 이상의 DB조작을 가리킴
(= 여러개의 작업을 하나로 묶은 실행 유닛)
- 분할할 수 없는 최소단위이므로 -> 전부 적용하거나, 전부 취소해야 함
(= 성공 or 실패 두 개의 결과만 존재함)
ACID ?
데이터베이스 트랜젝션이 발생할 때, 그 안전성을 보장할 수 있는 성질
- 원자성 (Atomicity)
- 일관성(Consistency)
- 고립성(Isolation)
- 지속성(Durability)
원자성(Atomicity)
트랜잭션의 연산은 모두 적용되던지, 아니면 전혀 실행되지 않은 상태여야함
(= 모든 연산이 성공 or 모두 실패)
ex) 한 트랜잭션 안에
1. A 계좌에서 출금한다.
2. 그 돈을 B 계좌로 넣는다. 가 있다고 쳤을때,
1은 성공하고 2는 실패하게 된다면
A 계좌에서 출금한 돈이 어디로 가게 되는거지? --> 데이터 손실 발생
무조건 1+2 함께 성공하거나, 실패하거나.
일관성(Consistency)
트랜잭션 실행전 DB에 이상이 없다면, 실행후에도 일관되게 이상이 없어야함
제약이 변경되거나 하지 않고 일관된 상태를 가져야 한다!
ex) A 데이터베이스의 제약 - '모든 고객은 반드시 이름을 가지고 있어야 한다'
어떤 트랜잭션이
- 이름 없는 새로운 고객을 추가하는 쿼리
- 기존 고객의 이름을 삭제하는 쿼리
일 경우, 기존 제약을 위반하게 된다! 안됨안됨
고립성(Isolation)
트랜잭션 실행 중, 다른 트랜잭션의 영향을 받아선 안됨
(= 모든 트랜잭션은 다른 트랜잭션으로부터 독립되어야 한다)
트랜잭션이 동시에 실행될 경우 = 연속으로 실행될 경우
DB 상태가 동일하다~
지속성(Durability)
트랜잭션이 성공적으로 수행되면, 영구적으로 반영되어 저장됨
성공 or 실패한 트랜잭션에는 해당 트랜잭션에 대한 로그가 남는다.
해당 기록은 '영구적'이다.
로그를 기록하기 전에 실패했을 경우? --> 트랜잭션 실행 이전 원래 상태로 돌아가게 됨.