Database의 트랜잭션이 안전하게 수행된다느것을 보장하기 위한 성질을 가리키는 약어이다
Transaction 이란 데이터베이스 상태를 변화시키는 쪼갤 수 없는 작업의 최소 단위
https://velog.io/@character_c/DB-Transaction이란
트랜잭션은 원자와 같이 나뉘어질 수 없기 때문에 트랜잭션의 결과는 성공 혹은 실패만 존재한다
일부는 성공 일부는 실패한다면 트랜잭션의 결과를 예상할 수 없고 불안정한 상태가 된다
안전성을 보장하기 위해 하나의 트랜잭션의 모든 작업은 모두 성공하거나 모두 실패해야하며 이를 위해 일부가 실패할 경우 성공한 작업들도 Rollback을 수행하여 전체 작업을 실패로 만든다
Ex) A계좌에서 10만원의 돈을 인출하여 B계좌로 입금하는 트랜잭션을 예로 들어보면 트랜잭션에는 다음과 같은 작업들이 있다
1. A계좌를 조회한다
2. A계좌에서 10만원 을 인출한다
3. B계좌에 10만원을 입금한다
이때 2번의 인출까지는 성공하였지만 3번 단계에서 실패가 발생한 상태로 종료된다면 A계좌에서 사라진 10만원은 더 이상 존재하지 않는다
그렇기 때문에 3번단계에서 실패가 발생한다면 2번의 인출 또한 원복하여 Data는 안전하게 보존하고 트랜잭션은 실패로 끝나야 한다
트랜잭션 이전과 이후의 Database의 상태는 일관되게 유지되어야 한다
Database의 상태라함은 Database에 설정된 제약과 규칙을 포함한다
Ex) 은행에서 신규 계좌를 발급할때 계좌DB에는 모든 계좌는 계좌번호가 있어야 한다는 규칙이 있다고 가정한다
트랜잭션 이후 번호가 없는 계좌가 추가된다거나, 계좌번호만 삭제된다면 모든 계좌는 계좌번호가 있어야 한다는 규칙이 모든 계좌에 계좌번호가 있어야 하는것은 아니다 로 성질이 변하기 때문에 이는 일관되지 않다
모든 트랜잭션은 다른 트랜잭션과 독립되어야 한다
이를 다르게 표현하면 트랜잭션이 동시에 수행된 결과와 각각 순차적으로 수행된 결과가 같아야한다
Ex) 만원이 들어있는 통장에서 6천원(A),4천원(B)을 출금하는 2개의 트랜잭션이 발생했다
각각의 트랜잭션은 다음의 작업을 포함한다
- 계좌의 잔금을 조회한다
- A : 6천원을 출금한다, B : 4천원을 출금한다
트랜잭션이 각각 수행된다면 다음과 같다
A-계좌의 잔금을 조회한다(잔금 : 10,000)
A-6천원을 출금한다(10,000-6,000)
B-계좌의 잔금을 조회한다(잔금 : 4,000)
B-4천원을 출금한다(4,000-4,000)
결과 잔금 : 0
트랜잭션이 동시에 수행되면 다음과 같다
A-계좌의 잔금을 조회한다(잔금 : 10,000)
B-계좌의 잔금을 조회한다(잔금 : 10,000)
A-6천원을 출금한다(10,000-6,000)
B-4천원을 출금한다(10,000-4,000)
결과 잔금 : 6,000
A 트랜잭션에서 발생한 Update가 B트랜잭션으로 인해 사라지면서 결과가 달라졌다(Lost Update)
이러한 현상을 방지하기 위해 각각의 트랜잭션은 독립적으로 수행되어야 한다.
Lost Update외 Dirty reads, Non-repeatable reads, Phantom Reads 등의 현상이 있다
Isolation Level(격리 수준)에 따라 더 많은 현상을 방지 할 수 있으나 동시처리 성능이 떨어지는 단점이 있다.
이 부분에 대해서는 추가적으로 정리가 필요할것 같다
성공적으로 종료된 트랜잭션은 영구적으로 기록이 남아야한다
트랜잭션이 성공적으로 종료되었으나 결과가 Disk에 저장되기전에 시스템 문제등으로 Down이 발생하여 트랜잭션의 결과가 사라지면 안된다는 얘기다
Ex) A계좌에 10만원을 입금하는 트랜잭션이 있다
사용자는 A계좌에 10만원을 입금했고 성공적으로 종료됐다는 Ack를 받았다
Ack가 전달된 뒤 DBMS가 종료되어 10만원을 입금했다는 기록이 사라진다면 성공했음에도 돈이 사라지는 문제가 발생된다
ACID는 트랜잭션이 안정적으로 수행된다는 성질을 나타내는 지표이고 DBMS마다 성질을 만족하는 방법은 다를 수 있다.
개발을 진행할 때 RDBMS가 어떻게 이 성질을 만족시키는지를 이해하지 않더라도 RDBMS가 지원하는 기능이나 특징만 알더라도 충분히 활용할 수 있다
다만 안전성을 중시하는 ACID 모델의 DBMS와 달리 가용성을 중시하는 DBMS도 있다. 아직 존재하지 않지만 새로운 DBMS를 이해 할때도 이러한 성질에 대해서 알고 있는것은 도움이 될 수 있다