14. DB transaction과 ACID
DB Transaction
둘 다 정상 처리돼야만 성공하는 단일 작업!, 단일한 논리적인 작업 단위 (a single logical unit of work)
논리적인 이유로 여러 SQL문들을 단일 작업으로 묶어서 나눠질 수 없게 만든 것이 transaction
transaction의 SQL문들 중에 일부만 성공해서 DB에 반영되는 일은 일어나지 않음
Ex) J의 이체 작업이 성공해서 H의 올바른 계좌 잔액이 출력 가능
MySQL에서의 transacton을 사용한 예제
위 그림 예시처럼 start transaction과 commit 사이에 하나의 트랜잭션을 만들 수 있음
이처럼 start transaction을 하면 DB 커넥션이 맺어지면서 AutoCommit을 Off하고 해당 DB의 테이블은 Lock이 걸려 다른 사람이 접근할 수 없음
Commit : 지금까지 작업한 내용을 DB에 영구적으로 (permanently) 저장하고 transaction을 종료한다
만약 추가로 J가 H에게 30만원 이체한 것을 transaction으로 구현하자
Rollack을 하면 transaction 작업이 취소되어 데이터가 원래대로 복구가 됨 그리고 AutoCommit이 다시 활성화됨
Rollack 하면 원복 시점 : Strat Transaction / Commit
자바 코드에서의 DB Transaction
아래 왼쪽 코드와 같이 자바에서 db 작업을 처리하려면 (1) 노란색의 transaction과 관련된 코드 (2) 실제 db 데이터 처리 로직으로 구성이 되게 코드를 작성해야함
하지만 @Transactional 처리를 해줌으로써 오른쪽 그림처럼 (2) 실제 db 데이터 처리 로직 코드만으로 db 작업이 가능
※ AutoCommit : 자동으로 commit을 해주는 설정
ACID
ACID는 Transaction이 가져야할 속성
1. Atomicity (원자성) : 실행하는 작업들이 모두 성공하거나, 모두 실패하거나 = All or Nothing
transaction은 논리적으로 쪼개질 수 없는 작업 단위이기 때문에 내부의 SQL문들이 모두 성공해야 함
중간에 SQL문이 실패하면 지금까지의 작업을 모두 취소하여 아무 일도 없었던 것처럼 rollback함
데이터 처리는 DBMS에게 맡기고 (Commit 실행, rollback 실행 등...)
개발자는 언제 commit 또는 rollback 할지 시점를 정하면됨
2. Consistency (일관성)
transaction은 db상태를 consistent 상태에서 또 다른 consistent 상태로 유지해야함
constraints, trigger 등을 통해 DB에 정의된 rules을 transaction이 위반했다면 rollback 해야 함
transaction이 db에 정의된 rule을 위반했는지는 DBMS가 commit 전에 확인하고 알려줌
그 외에 application 관점에서 transaction이 consistent하게 동작하는지는 개발자가 챙겨야함
아래와 같이 J가 H에게 100만원을 이체하는 작업을 실행 후, J의 계좌 잔고가 -20만원이면
이는 table 제약사항에 해당하는 일어날수없는 일!
즉 db의 일관성을 위해 이 작업은 수행하면 안되는 작업임
3. Isolation (격리)
여러 transaction들이 동시에 실행될 때도 혼자 실행되는 것처럼 동작하게 만듦
이 isolation은 엄격하게 지키게 db를 설계하면 db의 성능이 떨어짐
때문에 DBMS는 여러종류의 isolation level을 제공
개발자는 isolation level 중에 어떤 level로 transsaction을 동작시킬지 설정할 수 있음
* concurrency control의 주된 목표가 isolation임
J가 H에게 20만원을 이체할 때, H도 ATM에서 본인 계좌에 30만원을 입금한다면?
아래와 같이 타이밍이 안맞아 여러 트랜잭션들이 동시에 실행하니 문제가 발생할 수 있는 가능성을 isolation 설정을 통해서 방지해야함
4. Durability 영존성
commit 후, transaction은 db에 영구적으로 저장한다.
즉 db 시스템에 문제 (power fail or DB crash)가 생겨도 commit 된 transaction은 db에 남아있음
* 영구적으로 저장한다 라고 할 때는 일반적으로 비휘발성 메모리 HDD< SSD에 저장함 을 의미
기본적으로 transaction의 durability는 DBMS가 보장함
참고 사항
1. transaction을 어떻게 정의해서 쓸지는 개발자가 정하는 것임
구현하려는 기능과 ACID 속성을 이해해야 transaction을 잘 정의할 수 있음
2. transaction의 ACID와 관련해서 개발자가 챙겨야 하는 부분들이 있음
즉 DBMS 가 모든 것을 알아서 해주는 것은 아님!
3. 다양한 db의 방언이 있으므로 참고!