[Database] 4. 트랜잭션과 무결성

1. 트랜잭션이란?

1.1. 트랜잭션의 정의

- 데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위

- 데이터베이스의 상태를 변화시킬 때, 이를 완전하게 수행하거나 하나도 수행하지 않아야 함

 

1.2. 트랜잭션의 목적

- 데이터베이스의 무결성을 보장하고, 데이터베이스 조작(삽입, 수정, 삭제)을 안전하게 하기 위함

- 트랜잭션의 특징으로는 원자성, 일관성, 고립성, 지속성이 있음 (합쳐서 ACID라고 함)

 

2. 무결성 (Integrity)

- 데이터의 정확성, 일관성, 유효성을 유지하는 것

- 즉, 데이터가 정확하고 신뢰할 수 있어야 함을 의미함

- DBMS는 데이터베이스가 무결성을 위반하지 않도록 다음과 같은 제약 조건을 설정할 수 있음

 

개체 무결성

- 기본 키로 선택된 필드는 빈 값을 허용하지 않음

 

참조 무결성

- 서로 참조 관계에 있는 두 테이블의 데이터는 항상 일관된 값을 유지해야 함

 

고유 무결성

- 특정 속성에 대해 고유한 값을 가지도록 조건이 주어진 경우, 각 레코드의 값은 서로 달라야 함 (고유해야 함)

 

NULL 무결성

- 특정 속성 값에 대해 NULL이 올 수 없다는 조건이 주어진 경우, 그 속성 값은 NULL이 될 수 없음

 

3. ACID

3.1. 원자성 (Atomicity)

3.1.1. 원자성이란?

- 하나의 작업이 완전하게 수행되거나 전혀 수행되지 않아야 함

- 즉, 트랜잭션 내의 모든 데이터 조작(삽입, 삭제, 수정)원자적으로 처리되어야 하며, 중간에 어떤 문제가 발생하면 트랜잭션은 롤백되어 이전 상태로 복구됨

 

하나의 쿼리가 하나의 트랜잭션일까?

일반적으로 하나의 트랜잭션은 하나 이상의 쿼리로 구성됨

ex) 은행에서 계좌 간 100만원을 이체를 하는 논리적 기능(트랜잭션)은 다음과 같이 두 쿼리로 나뉨

      1. 고객 A의 계좌에서 100만원을 출금하는 쿼리

      2. 고객 B의 계좌에서 100만원을 입금하는 쿼리

      이 두 쿼리는 하나의 트랜잭션 내에서 함께 수행되어야 하며, 원자성을 준수하여 한 쿼리가 실패하면 다른 쿼리도 롤백되어 돈의 일관성을 보장함

 

3.1.2. 커밋 (Commit)

- 트랜잭션의 완료 및 적용 단계를 의미함

- 트랜잭션 내의 모든 데이터 조작이 성공적으로 수행되고 데이터베이스가 일관성 있는 상태에 도달하면, 트랜잭션을 커밋하여 데이터베이스에 변경 사항을 영구적으로 저장함

- 커밋 후에는 트랜잭션이 종료됨

- MySQL의 경우 default가 autocommit으로 설정되어 있음

 

3.1.3. 롤백 (Rollback)

- 트랜잭션을 취소하고 이전 상태로 복구하는 작업을 의미함

- 트랜잭션 중간에 오류가 발생하거나 트랜잭션의 실행을 중단하려는 경우에 사용됨

 

3.2. 일관성 (Consistency)

- 트랜잭션 전후에도 데이터베이스가 일관된 상태로 유지되어 무결성 규칙이 지켜져야 함

 

ex) 은행에서 계좌 간 100만원을 이체를 하는 트랜잭션 (초기에 A 계좌 100만원, B 계좌 0원이 있다고 가정하자)

      1. 고객 A의 계좌에서 100만원을 출금하는 쿼리를 실행함

      2. 고객 B의 계좌에서 100만원을 입금하는 쿼리를 실행함

      트랜잭션 이전 상태에서 두 고객의 잔액의 합은 100만원, 트랜잭션 이후 상태에서도 두 고객의 잔액의 합은 100만원으로 동일해야 함

 

3.3. 격리성 (Isolation)

3.3.1. 격리성이란?

- 다수의 트랜잭션이 동시에 실행될 때, 각 트랜잭션은 다른 트랜잭션의 영향을 받지 않고 독립적으로 실행되어야 함

 

3.3.2. 격리성을 보장하기 위한 방법

격리 수준

- DBMS는 트랜잭션의 격리 수준을 설정하여 여러 트랜잭션이 동시에 실행될 때의 동작을 제어함

- Read Uncommitted, Read Committed, Repeatable Read, Serializable 로 나뉨

 

(격리 수준에 대한 내용은 추후 정리...)

 

락 (Locks)

- DBMS는 락을 사용하여 데이터베이스 객체(행, 테이블 등)를 잠그고 다른 트랜잭션이 해당 객체를 변경하지 못하도록 함

- 트랜잭션 간의 충돌을 방지하는 데 사용됨

 

(락에 대한 내용은 추후 정리...)

 

3.4. 지속성 (Durability)

3.4.1. 지속성이란?

- 트랜잭션의 결과를 영구적으로 저장하고 보존해야 함

- 이는 데이터베이스 시스템에 장애가 발생해도 원래 상태로 복구할 수 있는 회복 기능이 있어야 함을 의미함

 

3.4.2. 지속성을 보장하기 위한 방법

트랜잭션 커밋

- 트랜잭션이 완료되고 데이터베이스에 커밋되면, 변경 사항은 데이터베이스에 영구적으로 적용됨

- 커밋된 트랜잭션은 시스템 장애 또는 재시작 후에도 그 결과가 유지됨

 

저널링 (Journalling)

- 데이터베이스 시스템에 트랜잭션의 변경 사항을 로그에 기록하는 것

- 트랜잭션이 데이터베이스를 변경할 때, 해당 변경 사항을 로그 파일에 기록함

- 이 로그 파일은 변경 사항이 커밋되기 전까지 유지되며, 트랜잭션이 커밋되면 해당 변경 사항을 실제 데이터베이스에 적용함

- 또한 이는 시스템 고장으로부터 복구할 때 유용함

 

체크섬 (Checksum)

- 데이터베이스의 체크섬은 주로 디스크에 저장된 데이터의 무결성을 확인하는 데 사용됨

- 데이터 블록 또는 파일의 내용을 해시 함수를 사용하여 계산하고 저장함

- 나중에 데이터를 읽을 때, 데이터의 체크섬을 다시 계산하여 저장된 체크섬과 비교하며 데이터의 손상 여부를 판단함