트랜잭션과 무결성

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