트랜잭션
트랜잭션이란, DB의 상태를 변화시키는 작업의 최소 단위를 의미한다.
트랜잭션은 더 작은 작업으로 쪼갤 수 없으며, 포함된 명령어들을 모두 하나로 간주하여 처리해야 한다.
예시를 하나 들어보자.
A계좌에서 B계좌로 500,000원을 송금한다고 해보자.
과정은 이렇게 이루어질 것이다.
1. A계좌에서 B계좌로 송금을 신청한다.
2. A 계좌의 잔액에서 500,000원이 차감된다.
3. B 계좌의 잔액에 500,000원이 더해진다.
송금이라는 작업을 오류없이 실행하기 위해선, 위의 세 과정이 모두 이루어져야 한다.
만약, 작업을 쪼개서 1, 2번만 실행하게 된다면? A계좌에선 500,000원이 인출되었는데 B 계좌에 입금되지 않았으므로, 500,000원은 그대로 증발하게 된다.
이처럼, 위의 세 작업은 더 작은 작업으로 쪼갤 수 없고 반드시 함께 실행되어야 한다.
이렇게, 더이상 분할할 수 없고 반드시 함께 실행되어야 하는 작업을 트랜잭션이라고 하는 것이다.
트랜잭션은 포함된 명령어들이 모두 성공해야만 의도한 결과를 달성할 수 있다.
그러므로 1~3번중 실패한 명령어가 하나라도 있다면, 트랜잭션은 완전히 실패한 것으로 간주해야 한다.
커밋, 롤백
트랜잭션에는 커밋과 롤백이라는 두 가지 기능을 사용할 수 있다.
커밋이란, 트랜잭션이 성공적으로 완료되었을 때 그 결과를 로그에 남기고 DB에 반영하는 것을 의미한다.
성공적으로 완료되었다는 것은 트랜잭션에 포함된 모든 명령어가 성공했다는 의미이다.
커밋을 하기 전까지 트랜잭션의 결과는 실제 DB에 반영되지 않고, 가상으로만 존재하게 된다.
커밋을 하게 되면 비로소 DB에 트랜잭션의 결과를 반영하게 된다.
롤백이란, 트랜잭션이 실패하였을 때 트랜잭션 실행 이전으로 되돌리는 것이다.
트랜잭션에 포함된 여러 명령어 중 하나라고 실패했다면, 해당 트랜잭션은 완전히 실패한 것으로 간주해야 한다.
실패한 트랜잭션을 DB에 반영할 수는 없을 것이다. 그러므로, 작업을 다시 되돌려야 한다.
이 것을 롤백이라고 한다.
ACID
트랜잭션의 안정성을 보장하기 위해서 확보되어야 하는 4가지의 속성이 있다.
Atomicity(원자성), Consistency(일관성), Isolation(고립성), Durability(지속성) 4가지의 앞글자를 따서 ACID라고 한다.
Atomicity(원자성) : 원자성이란, 작업을 더이상 쪼갤 수 없음을 의미한다. 쪼갤 수 없다는 것은 작업에 포함된 모든 명령어는 하나처럼 실행되어야 한다는 것이다.
트랜잭션 내의 명령어는 모두 성공하거나, 모두 실패해야 한다. DB에 반영하고자 한다면, 모든 명령어의 결과가 DB에 반영되어야 하며, 반영하지 않겠다면 모든 명령어의 결과가 DB에 반영되지 않아야 한다. 또한, 트랜잭션에 포함된 명령어들은 반드시 순차적으로 모두 실행되어야 한다
이처럼, 하나의 트랜잭션에 속한 모든 명령어들은 하나처럼 작동해야 한다.
위에서 예시로 들었던 송금 과정에서, 인출만 성공하고 입금은 실패했다고 해보자.
이 때, 성공한 인출에 대해서만 DB에 반영하고 실패한 입금에 대해선 DB에 반영하지 않는다면 계좌 잔액에 이상이 발견될 것이다.
그렇기 때문에 실패한 명령어가 하나라도 있다면 모든 명령어가 실패한 것으로 간주하고 롤백해야 한다.
Consistency(일관성) : 트랜잭션 이전과 이후의 DB 상태는 동일해야 함을 의미한다.
예를 들어, 국민 관리 데이터 베이스에서 모든 국민에게 주민번호를 부여하도록 규칙을 정했다고 해보자.
해당 규칙으로 인해, 주민번호에는 null이 들어가선 안된다.
그런데, 아직 주민번호가 발급되지 않은 신생아 A의 데이터를 DB에 삽입하려고 한다면?
주민번호가 존재하지 않기 때문에, 주민번호에 null을 삽입하게 될 것이다.
A의 데이터를 삽입하기 전까지 규칙을 지키며 유지되던 데이터 베이스의 상태가 A의 데이터를 삽입한 이후로 꺠져버린 것이다. 이는 일관성을 위반한 사례라고 할 수 있다.
이를 방지하기 위해, 주민번호가 발급되지 않은 신생아의 경우, 임시 신생아 번호를 부여하여 주민번호가 발급되기 전까지 주민번호를 대체하여 저장된다. 현실에서 볼 수 있는 임시 학번, 임시 신생아 번호 등이 일관성을 지키기 위한 노력이라고 볼 수 있는 것이다.
Isolation(고립성) : 모든 트랜잭션은 서로에게 영향을 주지 않고 독립적으로 실행되어야 함을 의미한다.
여러 트랜잭션이 병렬적으로 실행될 때, 순차적으로 실행된 경우와 결과가 같아야 한다는 뜻이다.
잔액이 500원이 남은 계좌에서 500원을 출금하는 트랜잭션과 1000원을
입금하는 트랜잭션이 병렬적으로 실행되고 있다고 해보자.
출금 트랜잭션에선, 500원을 출금하기 위해 잔액을 확인한 뒤 500원을 차감할 것이다.
그리고, 입금 트랜잭션이 정상적으로 실행되었다면 0원 남은 계좌에 천원을 더해, 잔액을 천원으로 변경할 것이다.
하지만, 두 작업이 병렬로 실행된다면 두 작업 모두 500원의 잔액을 확인할 가능성이 발생한다.
그로 인해, 위의 그림처럼 입금 트랜잭션은1000원이 아닌 1500원을 기록할 가능성이 생긴다.
1500원을 기록하게 되면서, 출금 트랜잭션의 결과를 완전히 무시하게 되었다.
이는 고립성을 위반한 사례가 된다. 두 트랜잭션이 병렬로 실행된 결과는 순차적으로 실행된 결과와 다르며, 하나의 트랜잭션이 다른 트랜잭션에 간섭하고 영향을 주고 있다.
트랜잭션은 병렬로 실행될 때, 서로에게 영향을 주지 않고 독립적으로 실행되어야 한다.
고립성을 보장하기 위해 Lock, TimeStamp 등의 기법을 활용하게 된다.
Durability(지속성) : 성공한 트랜잭션의 결과는 영구히 DB에 기록되어야 함을 의미한다.
데이터 베이스가 시스템 오류로 인해, 중간에 종료되더라도 한 번 성공안 트랜잭션의 결과는 계속 보존되어야 한다.
계좌에 1000원을 입금했는데, 갑자기 데이터 베이스에 시스템 이상이 발생하여 입금내역이 증발했다면 이는 지속성을 위반한 사례라고 할 수 있다.
일단 트랜잭션이 성공했다면, 데이터 베이스가 종료되는 등의 시스템 이상이 발생하더라도 트랜잭션의 결과는 영구히 DB에서 확인할 수 있어야 한다.
만약, 트랜잭션 중간에 시스템이 종료되었다면, 해당 트랜잭션은 모든 명령어를 성공하지 못한 상태이므로 롤백되어야 한다.
'데이터베이스' 카테고리의 다른 글
데이터베이스 (DB) - 데이터의 무결성 (0) | 2024.06.05 |
---|---|
데이터베이스 (DB) - 트랜잭션의 격리 수준 (0) | 2024.06.04 |
데이터베이스 (DB) - 키의 종류 (슈퍼키, 후보키, 기본키, 대체키, 외래키) (1) | 2024.05.31 |
데이터베이스(DB) - 정규화 (제 1 정규화, 제 2 정규화, 제 3 정규화) (1) | 2024.05.31 |