트랜잭션과 무결성
1. 트랜잭션
데이터베이스에서 하나의 논리적인 기능을 수행하기 위한 작업의 단위
여러 개의 쿼리들을 하나로 묶는 단위를 말한다.
ACID 특징
원자성
일관성
독립성
지속성
2. 원자성, Automicity
all or nothing
트랜잭션과 관련된 일이 모두 수행이 되었거나 되지 않았거나를 보장하는 특징이다.
트랜잭션을 커밋했는데, 문제가 발생하여 롤백하는 경우, 그 이후에 모두 수행되지 않음을 보장하는 것을 말한다.
1000만원을 가진 짱구가 0원을 가진 철수에게 500만원을 준다고 가정해보면 아래와 같은 순서로 operation 들이 수행될 것이다.
먼저 짱구의 잔액을 조회한다.
500만원을 짱구의 계좌에서 뺀다.
500만원을 철수의 계좌로 전달한다.
하지만 일반 사용자의 입장에서는 이 과정을 알 수 없고 알 필요도 없이, 그냥 500만원의 숫자가 바뀐 것만 볼 수 있다.
만약 위의 operations 들이 롤백된다고 가정해보자. 그렇다면, 최종 결과는 다시 짱구가 1000만원, 철수가 500만원을 가지고 있어야 하겠지만, 일부만 수행될 경우, 짱구가 500만원, 철수가 0원인 경우가 발생할 수 있다.
이 경우가 원자성이 보장되지 않은 경우일 것이다.
3. 일관성, Consistency
트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것
데이터베이스에 기록된 모든 데이터는 여러가지 조건, 규칙에 따라서 유효함을 가져야 한다.
허용된 방식으로만 데이터를 변경해야한다.
예시
모든 계좌에는 잔고가 1원이라고 있어야 한다면, 이를 위반하는 트랜잭션은 중단된다.
0월을 가진 철수는 1000만원을 가진 짱구에게 입금할 수 없다.
모든 고객은 반드시 이름을 가지고 있어야 한다는 제약사항이 있다면 (name = PK)
이름이 없는 고객을 추가할 수 없다.
기존 고객의 이름을 삭제할 수 없다.
4. 격리성 / 독립성 isolation
트랜잭션 수행시에 서로 끼어들지 못하는 것을 말한다.
복수의 병렬 트랜잭션은 서로 격리되어서 마치 순차적으로 실행되는 것처럼 작동되어야 한다.
트랜잭션이 동시에 실행될 때와, 연속으로 실행될 때, 데이터베이스 상태가 동일해야한다.
그냥 순차적으로 하면 쉽게 되겠지만, 성능이 나빠질 것이다.
데이터베이스는 여러 사용자가 같은 데이터에 접근할 수 있어야 한다.
격리성을 지키는 각 트랜잭션은 철저히 독립적이다. 따라서 다른 트랜잭션의 작업내용을 알 수가 없다.
격리수준을 나누어서 이를 기준으로 격리성을 보장한다.
5. 지속성, durability
성공적으로 수행된 트랜잭션은 영원히 반영되어야 하는 것을 의미한다.
데이터베이스에 시스템 장애가 발생해도 원래 상태로 복구하는 회복 기능이 있어야 한다는 것을 의미한다.
모든 트랜잭션은 로그로 남고, 시스템 장애 발생 전 상태로 되돌릴 수 있다.
로그에 모든 것이 저장된 후에만 commit 상태로 간주할 수 있다.
이를 위해 데이터베이스에서는 체크섬, 저널링, 롤백 등의 기능이 제공된다.
6. 무결성
데이터의 정확성, 일관성, 유효성을 유지하는 것을 말하며, 무결성이 유지되어야 데이터베이스에 저장된 데이터 값과 그 값에 해당하는 현실 세계의 실제 값이 일치하는 지에 대한 신뢰가 생긴다.
개체 무결성 : 기본키로 선택된 필드는 빈 값을 허용하지 않는다.
참조 무결성 : 서로 참조 관계에 있는 두 테이블의 데이터는 항상 일관된 값을 유지해야한다.
고유 무결성 : 특정 속성에 대해 고유한 값을 가지도록 조건이 주어진 경우, 그 속성값은 모두 고유한 값을 가진다.
NULL 무결성
Last updated