데이터베이스 2: 데이터베이스 트랜잭션 ACID 특성 뜻, 정의, 개념

데이터베이스 트랜잭션

데이터베이스 트랜잭션 (Transaction) 과 트랜잭션 ACID 는 데이터베이스의 핵심 개념으로, 개발자의 기술 면접에서 자주 다루는 주제입니다. 그리하여, 이번 글에서는 데이터베이스에서 명령을 수행하는 데이터베이스 트랜잭션과 트랜잭션 ACID 특성 (원자성, 일관성, 격리성 / 고립성, 지속성) 에 대하여 알아보겠습니다.

데이터베이스 트랜잭션 (Transaction)

데이터베이스 트랜잭션 (Transaction) 이란, 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위를 뜻합니다. 따라서, 트랜잭션은 데이터베이스에서 논리적 작업의 단위입니다.

위에서 “데이터베이스의 상태를 변화시킨다” 는 것은, 아래의 데이터베이스 명령어를 활용하여 데이터를 생성, 조회, 수정, 삭제하는 CRUD (CREATE, READ, UPDATE, DELETE) 작업을 수행함을 의미합니다.

  • SELECT
  • INSERT
  • DELETE
  • UPDATE

이 때, 데이터베이스 트랜잭션은 하나 이상의 명령어를 사용하여 하나 이상의 CRUD 작업을 수행할 수도 있습니다.

트랜잭션의 동작

트랜잭션은 데이터를 접근하여 작업을 수행하기 위해서 4 가지 연산을 수행합니다.

  • Read 연산
  • Write 연산
  • Commit 연산
    • Commit 연산은 하나의 트랜잭션이 성공적으로 끝났을 경우, 성공한 트랜잭션의 결과를 저장하기 위한 연산입니다. 이 연산이 실행되면, 수행했던 트랜잭션은 데이터베이스 로그에 저장됩니다. (이 로그는 후에 Rollback 연산에 사용됩니다.)
  • Rollback 연산
    • Rollback 연산은 하나의 트랜잭션이 비정상적으로 수행 / 종료되었을 때, 트랜잭션의 결과를 모두 취소시키는 연산입니다. 이 때에는 데이터베이스의 로그를 사용하여 트랜잭션이 시작될 때의 상태로 되돌립니다.

정리하면, 트랜잭션의 Read, Write 연산을 통하여 데이터를 읽고 수정하며, Commit, Rollback 연산을 통하여 연산을 완료 혹은 취소합니다.

트랜잭션 목적

하나의 트랜잭션에서 진행된 작업은 Commit 을 통해 성공하거나 Rollback 을 통해 모두 취소됩니다. 따라서, 데이터베이스는 트랜잭션의 Commit 과 Rollback 연산을 통하여 데이터베이스 완전성 (integrity) 을 보장합니다.

트랜잭션 ACID 특성

트랜잭션 ACID
데이터베이스 트랜잭션 ACID 특성은 원자성, 일관성, 격리성 / 고립성, 지속성을 나타냅니다. (이미지 출처: https://www.geeksforgeeks.org/acid-properties-in-dbms/)

트랜잭션은 ACID 특성을 가지고 있습니다. (트랜잭션 ACID 특성은 Atomicity, Consistency, Isolation, Durability 의 줄임말 입니다.)

트랜잭션 ACID 특성은 데이터베이스의 안전성을 보장하기 위한 특성입니다.

원자성 (Atomicity)

원자성 (Atomicity) 은 트랜잭션이 데이터베이스에 모두 반영되거나 전혀 반영되지 않아야 한다는 특성입니다. 특정 쿼리를 실행했을 때 부분적으로 실패하는 부분이 있다면, 전부 실패한다는 의미입니다.

– 원자성을 보장하는 방법

데이터베이스는 트랜잭션을 수행할 때, 이전에 Commit 된 상태를 임시 영역에 따로 저장함으로써 원자성을 보장합니다. 이 때, 이전의 Commit 상태를 저장한 데이터를 저장되는 세그먼트를 롤백 세그먼트 (Rollback Segment)” 라고 합니다.

기본적으로는 데이터베이스 트랜잭션이 실패하면, 트랜잭션이 처음 실행되는 상태로 Rollback 되지만, 처음으로 Rollback 이 되지 않도록 중간 저장 지점인 “Save point” 를 지정할 수도 있습니다. Save point 를 지정하면, Rollback 할 때, save point 이전은 완전하다고 간주하고 데이터베이스를 그 상태로 되돌리게 됩니다.

일관성 (Consistency)

일관성 (Consistency) 이란, 트랜잭션의 전후 상태가 일관되어야 한다는 성질을 의미합니다. 즉, 데이터베이스 시스템이 가지고 있는 고정요소는 트랜잭션 수행 전과 트랜잭션 수행 완료 후의 상태가 같으며, 데이터베이스의 제약이나 규칙이 모두 만족함을 의미합니다.

예를 들면, 데이터베이스에 저장된 금액의 데이터 타입이 정수형 (integer) 인데, 트랜잭션 후에 문자열(string)이 될 수 없다는 의미입니다.

– 일관성을 보장하는 방법

트랜잭션의 일관성은 “트리거 (Trigger)” 를 통해 보장할 수 있습니다. 트리거는 어떤 이벤트와 조건이 발생했을 때 자동으로 실행되는 작업을 의미합니다.

테이블에서 데이터 레코드의 변경이 일어났을 때, 이를 참조하고 있는 다른 테이블의 레코드도 변경해주는 등의 작업을 통해서 일관성을 유지해주는 것이 그 예시입니다.

격리성 / 고립성 (Isolation)

격리성 / 고립성 (Isolation) 은 하나의 트랜잭션이 다른 트랜잭션의 연산에 영향을 줄 수 없다는 특성입니다. 격리성 / 고립성에 의하여, 모든 트랜잭션은 서로 간섭이 없고 독립적으로 작업을 수행합니다.

실제로 동시에 여러 개의 트랜잭션이 동시에 수행될 때, 각 트랜잭션은 고립 (격리) 되어 있어, 각각의 트랜잭션은 단독으로 실행된 것 같은 효과를 보입니다.

– 격리성 / 고립성을 보장하는 방법

“락 (Lock)” 을 이용하여 트랜잭션의 격리성 / 고립성을 보장할 수 있습니다. 뮤텍스의 락처럼 데이터를 읽거나 쓸 때 락을 획득하고 (lock), 작업이 끝났을 때 락을 해제합니다 (unlock).

지속성 (Durability)

지속성 (Durability) 은 성공적으로 완료된 트랜잭션의 결과가 영구적으로 반영되는 성질입니다. 지속성에 의하여, Commit 연산을 수행한 트랜잭션의 결과는 데이터베이스에 영구적으로 반영됩니다.

지속성을 보장하는 방법?

트랜잭션의 지속성을 보장하는 대표적인 방법은 데이터베이스의 복제본 (Redundancy) 을 만드는 “RAID (Redundant Array of Independent Disk)” 입니다.

RAID 는 트랜잭션의 결과를 하드 디스크에 로그로 기록하는 것입니다. 그 후, 시스템에 이상이 발생하면, 하드디스크의 로그를 사용해 이상이 발생하기 전 상태로 복원함으로써 지속성을 보장합니다.

마치며

데이터베이스 트랜잭션과 ACID 특성은 데이터베이스에서 가장 중요한 개념으로, 개발자의 기술 면접에서 자주 다루는 주제입니다. 트랜잭션 ACID 특성을 잘 이해하고 데이터베이스를 사용하시길 바랍니다.

함께 읽으면 좋은 글

Reference

Leave a Comment