DatabaseJun 23, 2025

Transaction & Integrity

Transaction & Integrity

트랜잭션과 무결성



목차



트랜잭션

트랜잭션(Transaction)은 데이터베이스에서 수행되는 작업의 단위로, 하나 이상의 데이터베이스 연산을 포함한다. 트랜잭션은 원자성, 일관성, 격리성, 지속성의 네 가지 속성을 가진다. 이 네 가지 속성을 합쳐 ACID라고 부른다.


원자성

원자성(Atomicity)은 트랜잭션이 완전히 수행되거나 전혀 수행되지 않음을 보장하는 속성이다. 트랜잭션 내의 모든 작업이 성공적으로 완료되어야만 데이터베이스에 반영되며, 중간에 오류가 발생하면 모든 작업이 취소되어 데이터베이스는 이전 상태로 되돌아간다. 예를 들어, 은행 계좌 간의 이체 작업에서 송금과 입금이 모두 성공적으로 완료되어야만 이체가 완료된다. 만약 송금이 성공했지만 입금이 실패했다면, 이체는 취소되어야 한다.


커밋과 롤백 커밋(Commit)은 트랜잭션이 성공적으로 완료되었음을 확정하는 명령이다. 커밋이 수행되면 트랜잭션 내의 모든 변경 사항이 데이터베이스에 반영된다. 예를 들어, 은행 계좌 간의 이체 작업에서 송금 -> 기록 -> 입금 -> 기록의 순서로 작업이 수행되었다면, 모든 작업이 성공적으로 완료된 후 커밋을 수행하여 이체를 확정한다. 롤백(Rollback)은 위의 트랜잭션을 수행하는 도중 오류가 발생했을 때, 트랜잭션을 시작했던 시점으로 되돌리는 명령이다. 이러한 과정은 작업을 그룹화하여 데이터베이스의 일관성을 유지하는 데 도움을 준다.


트랜잭션 전파 트랜잭션은 커넥션 객체에 묶여 있으며, 커넥션 객체가 트랜잭션을 시작하고 커밋 또는 롤백을 수행한다. 트랜잭션 전파(Propagation)는 트랜잭션이 시작된 커넥션 객체와 다른 커넥션 객체 간의 트랜잭션 상태를 공유하는 방법이다. 트랜잭션 전파는 여러 트랜잭션이 동시에 실행될 때, 각 트랜잭션이 독립적으로 실행되도록 보장한다.


일관성

일관성(Consistency)은 미리 정의된 규칙이나 제약 조건을 만족하는 상태로 데이터베이스가 유지되는 것을 의미한다. 예를 들어, 은행 계좌의 잔액이 음수가 되지 않도록 하는 제약 조건이 있다면, 트랜잭션이 수행되는 동안 이 제약 조건이 항상 유지되어야 한다. 트랜잭션이 성공적으로 완료되면 데이터베이스는 일관된 상태로 유지되어야 하며, 트랜잭션이 실패하면 데이터베이스는 이전 상태로 되돌아가야 한다.


격리성

격리성(Isolation)은 동시에 실행되는 트랜잭션이 서로 영향을 미치지 않도록 보장하는 속성이다. 트랜잭션이 실행되는 동안 다른 트랜잭션이 해당 데이터에 접근하지 못하도록 하여, 트랜잭션 간의 간섭을 방지한다. 예를 들어, 두 개의 트랜잭션이 동시에 같은 데이터를 수정하려고 할 때, 하나의 트랜잭션이 완료될 때까지 다른 트랜잭션은 대기해야 한다. 격리성은 트랜잭션의 실행 순서를 보장하여 데이터의 일관성을 유지한다.


격리 수준 트랜잭션의 격리 수준(Isolation Level)은 트랜잭션 간의 간섭을 얼마나 허용할지를 정의한다. 격리 수준은 다음과 같이 네 가지로 나눌 수 있다:

  • Read Uncommitted: 다른 트랜잭션이 커밋되지 않은 데이터를 읽을 수 있다. 가장 낮은 격리 수준으로, Dirty Read가 발생할 수 있다. 가장 빠른 성능을 제공하지만, 데이터의 일관성이 보장되지 않는다. 따라서 되도록이면 사용하지 않는 것이 좋으나 제대로 조회되지 않는 데이터가 있어도 상관없는 경우에는 사용하면 좋다.
  • Read Committed: 다른 트랜잭션이 커밋된 데이터만 읽을 수 있다. Dirty Read는 발생하지 않지만, Non-Repeatable Read가 발생할 수 있다. 가장 많이 사용되는 격리 수준이며, 동일한 조회를 수행할 때마다 다른 결과가 나올 수 있어 정합성에 어긋난다.
  • Repeatable Read: Read Committed와 마찬가지로 다른 트랜잭션이 커밋된 데이터만 읽을 수 있다. 하지만, 자신의 트랜잭션의 ID보다 낮은 ID를 가진 트랜잭션이 커밋된 데이터만 읽을 수 있으므로 Non-Repeatable Read가 발생하지 않는다.
  • Serializable: 가장 높은 격리 수준으로, 트랜잭션이 완전히 격리되어 실행된다. 여러 트랜잭션이 동시에 같은 데이터에 접근할 수 없으며, 다른 트랜잭션이 같은 데이터에 접근하기 전에는 현재 트랜잭션이 완료되어야 한다. 따라서, 교착 상태가 일어날 확률이 크며, 성능이 가장 낮다.

격리 수준에 따라 발생하는 현상
  • 팬텀 리드(Phantom Read): 하나의 트랜잭션이 실행되는 동안 다른 트랜잭션이 데이터를 삽입하거나 삭제하여, 같은 트랜잭션 내에서 동일한 조건으로 조회할 때 결과가 달라지는 현상이다. 예를 들어, 트랜잭션 A가 특정 조건을 만족하는 레코드를 조회한 후, 트랜잭션 B가 해당 조건을 만족하는 레코드를 삽입하면, 트랜잭션 A가 다시 조회할 때 새로운 레코드가 포함되어 결과가 달라진다.
  • 반복 가능하지 않은 조회(Non-Repeatable Read): 하나의 트랜잭션이 실행되는 동안 다른 트랜잭션이 데이터를 수정하여, 같은 트랜잭션 내에서 동일한 조건으로 조회할 때 결과가 달라지는 현상이다. 예를 들어, 트랜잭션 A가 특정 레코드를 조회한 후, 트랜잭션 B가 해당 레코드를 수정하면, 트랜잭션 A가 다시 조회할 때 수정된 결과가 반환된다.
  • 더티 리드(Dirty Read): 하나의 트랜잭션이 커밋되지 않은 데이터를 읽는 현상이다. 예를 들어, 트랜잭션 A가 특정 레코드를 수정한 후 커밋하지 않은 상태에서, 트랜잭션 B가 해당 레코드를 조회하면, 트랜잭션 B는 트랜잭션 A의 커밋되지 않은 데이터를 읽게 된다. 이 경우, 트랜잭션 A가 롤백하면 트랜잭션 B는 잘못된 데이터를 읽게 된다.

지속성

지속성(Durability)은 트랜잭션이 성공적으로 완료되면 그 결과가 영구적으로 데이터베이스에 반영되어야 함을 의미한다. 트랜잭션이 커밋되면, 해당 트랜잭션의 변경 사항은 시스템 장애가 발생하더라도 유지되어야 한다. 예를 들어, 은행 계좌 간의 이체 작업에서 송금과 입금이 모두 성공적으로 완료된 후 커밋을 수행하면, 이체 결과는 시스템 장애가 발생하더라도 유지되어야 한다. 지속성을 보장하기 위해 데이터베이스는 체크섬, 저널링, 롤백, 로그 등의 기술을 사용한다.



무결성

무결성(Integrity)은 데이터베이스의 데이터가 정확하고 일관되며 신뢰할 수 있는 상태를 유지하는 것을 의미한다. 무결성을 유지하기 위해 데이터베이스는 다양한 제약 조건과 규칙을 적용한다. 무결성은 크게 다음과 같은 종류가 있다.


개체 무결성

개체 무결성(Entity Integrity)은 데이터베이스의 각 레코드가 고유하게 식별될 수 있도록 보장하는 것을 의미한다. 각 레코드는 기본 키(Primary Key)를 가져야 하며, 기본 키는 NULL 값을 가질 수 없다. 개체 무결성을 유지하기 위해 데이터베이스는 기본 키 제약 조건을 적용한다. 기본 키 제약 조건은 릴레이션의 각 레코드를 고유하게 식별할 수 있도록 보장하며, 중복된 값과 NULL 값을 허용하지 않는다.


참조 무결성

참조 무결성(Referential Integrity)은 릴레이션 간의 관계를 유지하는 것을 의미한다. 외래 키(Foreign Key)를 사용하여 다른 릴레이션의 기본 키를 참조할 수 있으며, 외래 키는 NULL 값을 가질 수 있다. 참조 무결성을 유지하기 위해 데이터베이스는 외래 키 제약 조건을 적용한다. 외래 키 제약 조건은 외래 키가 참조하는 릴레이션의 기본 키와 일치해야 하며, 참조된 레코드가 삭제되거나 수정될 때 해당 외래 키를 가진 레코드도 함께 삭제되거나 수정되어야 한다. 예를 들어, 주문 엔티티의 회원 아이디 속성은 회원 엔티티의 아이디 속성을 참조하는 외래 키가 될 수 있다. 이 경우, 회원 엔티티의 아이디가 삭제되면, 해당 아이디를 참조하는 주문 엔티티의 레코드도 함께 삭제되어야 한다. 이러한 참조 무결성을 유지하기 위해 데이터베이스는 ON DELETE CASCADE, ON UPDATE CASCADE 등의 옵션을 제공한다.


도메인 무결성

도메인 무결성(Domain Integrity)은 데이터베이스의 각 속성이 정의된 도메인(값의 범위) 내에 있어야 함을 의미한다. 각 속성은 특정 데이터 타입과 값의 범위를 가지며, 이 범위를 벗어나는 값은 허용되지 않는다. 도메인 무결성을 유지하기 위해 데이터베이스는 CHECK 제약 조건을 적용한다. 예를 들어, 회원 엔티티의 나이 속성에 대해 CHECK (0 <= 나이 AND 나이 <= 120) 제약 조건을 적용하면, 나이가 0 이상 120 이하의 값만 허용된다.


NULL 무결성

NULL 무결성(NULL Integrity)은 데이터베이스의 각 속성이 NULL 값을 가질 수 있는지 여부를 정의하는 것을 의미한다. 일부 속성은 NULL 값을 가질 수 있지만, 다른 속성은 NULL 값을 가질 수 없다. NULL 무결성을 유지하기 위해 데이터베이스는 NOT NULL 제약 조건을 적용한다. NOT NULL 제약 조건은 해당 속성이 NULL 값을 가질 수 없도록 보장하며, NULL 값을 가진 레코드는 삽입할 수 없다. 예를 들어, 회원 엔티티의 이름 속성에 대해 NOT NULL 제약 조건을 적용하면, 이름이 NULL인 레코드는 삽입할 수 없다.

Share this post

N