Transaction은 상호작용이다. DB에서도 transaction은 상호작용으로 쓰이는데, 이번 posting에서는 DB와 관련된 내용인 transaction에 대해 자세히 다뤄보고자 한다.
데이터베이스 관리 시스템(DBMS) 또는 유사한 시스템에서 상호작용의 단위이다. 여기서 유사한 시스템이란 transaction이 성공과 실패가 분명하고 상호 독립적이며, 일관되고 믿을 수 있는 시스템을 의미한다.
이론적으로 데이터베이스 시스템(DBMS)은 각각의 transaction에 대해 원자성(Atomicity), 일관성(Consistency), 독립성(Isolation), 영구성(Durability)을 보장하며 이 성질을 첫글자를 따 ACID라 부른다. 그러나, 실제로는 성능향상을 위해 이런 특성들이 종종 완화되곤 한다.
그럼 원자성(Atomicity), 일관성(Consistency), 독립성(Isolation), 영구성(Durability)가 뭔지에 대해서 알아보도록 하자!
ACID에 대한 설명을 계좌이체를 예로들어 설명하겠다.
- Atomicity(원자성)
- Transaction과 관련된 작업들이 부분적으로 실행되다가 중단되지 않는 것을 보장하는 능력이다.
예를 들어, 계좌이체 과정에서는 송신과 수신이 한번에 이루어져야 한다. 한 쪽에서만 성공하고 한 쪽에서는 실패하는 일이 없어야 하기에, 둘다 성공하거나 둘 다 실패하도록 한다. 즉, 중간단꼐까지만 진행되지 않도록 해준다.
- Consistency(일관성)
- Transaction이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것을 의미한다.
예를 들어, 무결성 제약이 모든 계좌는 잔고가 있어야 한다면 이를 위반,하는 트랜잭션은 중단된다.
- Isolation(독립성)
- Transaction을 수행 시 다른 transaction의 연산 작업이 끼어들지 못하도록 보장하는 것을 의미한다.
이것은 transaction 밖에 있는 어떤 연산도 중간 단계의 데이터를 볼 수 없음을 의미한다.
예를 들어, 은행 관리자는 이체 작업을 하는 도중에 쿼리를 실행하더라도 특정 계좌간 이체하는 양 쪽을 볼 수 없다. 공식적으로 독립성은 트랜잭션 실행내역은 연속적이어야 함을 의미한다.
하지만, 독립성은 성능관련 이유로 인해 이 특성은 가장 유연성 있는 제약 조건이다.
- Durability(지속성)
- 성공적으로 수행된 transaction은 영원히 반영되어야 함을 의미한다.
즉, 시스템 문제, DB 일관성 체크 등을 하더라도 유지되어야 한다. 전형적으로 모든 transaction은 로그로 남고 시스템 장애 발생 전 상태로 되돌릴 수 있다. Transaction은 로그에 모든 것이 저장된 후에만 commit 상태로 간주될 수 있다.
Transaction의 기능은 사용자가 데이터베이스 완전성(integrity) 유지를 확신하게 한다.
단일 트랜잭션은 데이터베이스 내에 읽거나 쓰는 여러 개 쿼리를 요구한다. 이때, 중요한 것은 데이터베이스가 수행된 일부 쿼리만 남지 않는 것이다. 위에서 설명한 바와 같이, 송금을 할 때 한 계좌에서 인출되면 다른 계좌에서 입금이 확인되는 것이 중요하다. 또한, 트랜잭션은 서로 간섭하지 않아야 한다.
Transaction은 아래의 양식의 SQL문으로 데이터베이스 내에서 실행된다.
- Begin the transaction : SQL server or PostgreSQL
Start transaction : in MySQL
→ Transaction 시작 시 사용하는 command- Execute several queries
→ DB내 갱신이 아직 적용되지 않는다.- Commit the transaction
→ Transaction이 성공적이며, 갱신이 실제 적용된다.
만약 쿼리 하나가 실패하면, 데이터베이스 시스템은 전체 transaction 또는 실패한 쿼리를 rollback한다. 이것은 DBMS가 어떻게 사용되고 셋업 되었느냐에 따라 다르다. Transaction은 커밋전에 언제든지 수동으로 롤백될 수 있다.
❗️ 여기서 잠깐 ❗️
Transaction의 원리는 transaction 내에서 실행된 SQL 명령은 임시데이터 영역에서 수행되다가, commit 명령을 내리면 임시 데이터 영역에서 정식 데이터 영역으로 변경이 적용된다.
Rollback 명령을 내리면 임시 데이터 영역에서의 처리는 버려진다.
📖 출처 :
이번 포스팅을 통해 DB 내에서 일어나는 transaction에 대해 좀 더 자세히 알아보았다. Transaction 기능이라는게 중요한 기능인 것을 다시 한 번 느꼈다.