트랜잭션 (Transaction)
데이터베이스의 상태를 변환시키는 논리적 기능을 수행하기 위해 행해지는 하나 이상의 쿼리를 모아 놓은 하나의 작업 단위이다.
각 트랜잭션은 해당 트랜잭션에 포함되어 있는 모든 쿼리가 실행이 완료되어야 정상적으로 종료된다. 이 말은 단 하나의 쿼리라도 실패하게 된다면 그 트랜잭션은 실패한 것이다. 트랜잭션은 성공과 실패 두 가지의 결과만을 가진다.
은행을 예로 들어보자. 내가 친구에게 만 원을 송금하려고 한다. 그럼 이 송금에 대한 트랜잭션이 만들어 질 것이고, 해당 트랜잭션 안에는 내 계좌에서 만 원이 출금되는 쿼리와 친구 계좌로 만 원이 입금되는 쿼리가 존재할 것이다. 이 두 개의 쿼리 중 하나의 쿼리라도 실패하게 된다면 데이터베이스에 일관성이 깨지게 된다. 그렇기 때문에 트랜잭션 내의 모든 작업들은 성공이 되어야만 하나의 논리적 기능이 성공적으로 수행되었다고 할 수 있다.
ACID
데이터베이스 트랜잭션이 발생할 때, 그 안정성을 보장하기 위해 필요한 성질이다.
- Atomicity
- Consistency
- Isolation
- Durability
Atomicity 원자성
하나의 트랜잭션 내에서는 모든 작업이 성공하거나 모두 실패해야 한다.
트랜잭션 부분에서 설명했던 예시를 가지고 다시 보면 내가 친구에게 만 원을 송금하는 과정에는 내 계좌에서 출금이 되고 친구 계좌로 입금이 되는 작업이 필요하다. 만약 출금하는 과정은 성공했지만 입금하는 과정이 실패했다면 출금된 만 원은 없는 돈이 되어버린다. 반대로 생각해도 출금은 실패했는데 입금이 성공했다면 없던 돈이 복사가 되는 일이 발생한다. 트랜잭션 내에서 하나의 연산이라도 실패하게 되면, 모든 연산을 실패로 처리하고 이 전에 성공한 연산들을 롤백해야만 원자성이 지켜질 수 있다.
Consistency 일관성
하나의 트랜잭션 전 후에 데이터베이스의 일관된 데이터베이스 상태가 유지되어야 한다.
다른 말로는 하나의 트랜잭션 이전과 이후에 데이터베이스의 상태는 이전과 같이 유효해야 한다고 표현할 수 있다. 즉, 트랜잭션이 일어난 이후의 데이터베이스는 해당 데이터베이스의 제약이나 규칙을 여전히 만족하고 있어야 한다는 의미이다. 이러한 상태를 Corrent State라고 한다. 이 경우 트랜잭션 수행 도중에는 위배가 되더라고 최종 결과가 정상적인 상태라면 일관성이 유지되는 것이다.송금을 예로 들면, 계좌의 금액이 항상 양수여야 한다는 제약이 있다면 송금을 한 후에도 여전히 잔액이 양수여야 한다는 의미이다. 만약 송금을 함으로 인해 계좌의 잔액이 마이너스가 된다면 이는 일관성이 유지되지 않는 것이다.
Isolation 격리성, 고립성
각각의 트랜잭션은 독립적으로 수행되어야 한다. 서로의 연산을 확인받거나 영향을 줄 수 없다.
여러 개의 트랜잭션들이 동시에 수행될 때, 각 트랜잭션은 격리되어 있어 각각 독립적으로 연속되게 실행한 것과 동일한 결과를 얻어야 한다는 것이다. 친구 1과 친구 2에게 각각 만 원씩 송금하는 트랜잭션이 두 개가 동시에 수행된다면, 이 결과는 친구 1에게 송금을 완료한 후에 친구 2에게 송금을 하는 것처럼 각 트랜잭션을 순서대로 연속적으로 실행하는 것과 동일한 결과를 얻어야 한다는 것이다.
Durability 지속성
하나의 성공된 트랜잭션에 대한 로그가 영구적으로 기록되어야 한다. 만약 런타임 오류나 시스템 오류가 발생하더라도 로그들은 영구적으로 보존되어야 한다.만약 송금하는 트랜잭션 수행에 대한 로그가 남지 않은 상태에서 시스템 오류에 의해 시스템이 종료된다면, 해당 이체 내역은 실패가 되어 수행 내역들이 롤백된다.
'Database' 카테고리의 다른 글
[MongoDB] MongoDB 무료로 사용하기 (0) | 2022.02.23 |
---|