트랜잭션
트랜잭션(Transaction)이란 논리적인 작업 단위로 여러 개의 작업을 하나로 묶은 실행 유닛이다.
각 트랜잭션은 하나의 특정 작업으로 시작해서 묶여 있는 모든 작업들이 모두 완료되어야 정상적으로 종료한다. (Commit 실행)
만약, 트랜잭션에 속해있는 여러 작업 중에서 단 하나의 작업이라도 실패하면, 해당 트랜잭션에 속한 모든 작업은 실패한 것으로 판단한다.(Rollback으로 모든 작업 취소)
트랜잭션은 성공 또는 실패 두 가지 결과만 존재하며 미완료된 작업 없이 모든 작업을 성공해야 한다.
이러한 트랜잭션은 ACID라는 속성을 가지고 있어야 한다.
ACID
데이터베이스 내에서 발생하는 하나의 트랜잭션의 안정성을 보장하기 위해 필요한 성질이다.
원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)의 앞글자를 딴 규칙이다.
원자성 (Atomicity)
All or Nothing
원자성은 하나의 트랜잭션 내에서 모든 연산이 성공하거나 실패하는 것을 보장하는 성질이다. 즉, 일부만 성공하는 상태는 존재해서는 안된다.
예를 들어, A 가 B에게 계좌이체를 하는 트랜잭션이 있다고 가정한다면, 트랜잭션이 모두 완료되어야만 A와 B 계좌에서 정상적인 결과를 확인할 수 있어야 한다.
만약, A 계좌에서 이체를 하였는데 중간에 누락이 되어 실패한다면 해당 트랜잭션은 모두 실패하여 이체 중이던 금액이 A에게 돌아와야 한다.
원자성이 보장이 안된다면 A 계좌에는 이체 기록이 남고 금액도 차감되었지만, B 계좌에는 해당 기록이 안 남고 결과도 반영이 안 되는 등의 데이터 누락이 발생할 수 있다.
일관성 (Consistency)
트랜잭션 이전과 이후에 데이터베이스는 항상 일관된 상태여야 한다는 규칙이다. 즉, 트랜잭션이 일어난 이후의 데이터베이스는 데이터베이스의 제약이나 규칙을 만족해야 한다.
예를 들어, 은행의 모든 고객은 반드시 이름을 가지고 있어야 한다는 데이터베이스 제약이 있다고 가정한다면, 해당 은행에서는 이름이 없는 새로운 고객을 추가하거나, 기존 고객의 이름을 삭제하는 일이 발생해서는 안된다.
만약 이러한 상황이 발생하면 일관성을 위반하는 것이다.
데이터베이스의 유효한 상태는 서로 다를 수 있지만, 해당 상태에 대한 일관성은 변하지 않아야 한다.
고립성 (Isolation)
트랜잭션 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장하는 것을 의미한다. 즉, 트랜잭션 밖에 있는 어떤 연산도 중간 단계의 데이터를 볼 수 없음을 의미한다.
예를 들어, 10,000원이 있는 A 계좌에서 B에게 8,000원을 보내는 작업을 하는 도중에, C에게 5,000원을 보내는 작업을 할 수 없어야 한다.
B에게 송금이 끝나고 난 뒤, 남아있는 잔액에서 C에게 송금을 하도록 각 트랜잭션이 고립성을 보장해야 한다.
또한 20,000원이 있는 A 계좌에서 B에게 8,000원, C에게 5,000원을 보내는 작업을 동시에 한다고 해도 B에게 송금, C에게 송금을 순차적으로 실행한 결과와 동일하게 A에게는 7,000원이 남아있어야 한다.
즉, 고립성을 지키는 트랜잭션은 철저히 독립적이기 때문에 다른 트랜잭션의 작업 내용을 알 수 없으며, 동시에 실행되더라도 순차적으로 실행한 결과와 동일해야 한다.
지속성 (Durability)
커밋된 트랜잭션의 결과는 데이터베이스에 영구적으로 저장되어야 한다. 만약, 해당 트랜잭션에서 오류가 발생하더라도, 해당 기록 또한 영구적으로 남아있어야 한다.
예를 들어 은행에서 계좌에서 입출금이 발생한 이후, 해당 은행 데이터베이스에 오류가 발생하여 서버가 종료되더라도 입출금 내역은 기록으로 남아야 한다.
마찬가지로 입출금 발생하는 도중에 시스템 오류로 서버가 다운되더라도 해당 이체 내역은 실패로 돌아가고 입출금 발생 이전의 상태로 돌아가야 한다.
참고
'멋진 개발자 > DB' 카테고리의 다른 글
개발자 성장 기록 58 - 복합키 (0) | 2024.05.06 |
---|---|
개발자 성장 기록 57 - 캐시 (0) | 2024.05.03 |
개발자 성장 기록 56 - JOIN (0) | 2024.04.25 |
개발자 성장 기록 50 - 인덱스(Index) (0) | 2024.04.17 |
개발자 성장 기록 49 - Oracle과 MySQL (0) | 2024.04.16 |