블로그 포스트를 작성하고 게시되는 과정을 트랜잭션 ACID 속성에 빗대어 학습한 내용을 공유드려요.

들어가기 전에

새 포스트를 작성하고 게시하는 일련의 과정을 하나의 트랜잭션으로 생각해볼 수 있어요.
먼저, Post Entity의 필드에는 id, title, content, status만 있다고 가정할게요.
레코드에는 null 값이 허용되지 않으며, id는 자동생성, titlecontent는 입력받은 값이 들어가요.
status는 기본적으로 private로 되어있으나, 게시되면 public으로 변경되어요.

이 트랜잭션은 사용자가 "게시" 버튼을 누르는 순간 시작되어, 데이터베이스에 포스트가 안전하게 저장되고 방문자에게 공개될 준비를 마치는 순간 게시(커밋)되어요.

ACID

ACID에는 4가지 속성이 존재하는데요, 예시에 빗대어 쉽게 풀어볼게요.

원자성 (Atomicity) - All or Nothing

포스트를 작성하고 "게시" 버튼을 눌렀어요. 그러면, 트랜잭션은 다음 단계로 구성되어요.

  • 포스트 제목을 title에 저장
  • 포스트 내용을 content에 저장
  • 포스트 상태를 public으로 변경

원자성 보장

만약 이 과정 중에 단 하나라도 실패하면 전체 트랜잭션은 롤백되어야 해요.
원자성은 일관성 없는 상태를 허용하지 않아요.
모든 단계가 성공해야만 온전하게 포스트가 게시되며 그렇지 않으면 아무 일도 없었던 것처럼 되돌려져요.

일관성 (Consistency) - 미리 정해진 규칙 준수

포스트 작성에는 규칙이 존재할 수 있어요.

  • 모든 포스트는 반드시 제목을 가져야 한다. (null 불가)
  • 게시된 포스트는 상태가 발행됨으로 명확히 표시되어야 한다.

일관성 보장

포스트를 게시하는 트랜잭션이 성공적으로 완료되면, 데이터베이스는 항상 이러한 규칙들을 준수해야 해요.
만약, 제목을 비워두고 게시하거나, 존재하지 않은 상태로 변경하려 한다면, 트랜잭션은 실패하고 데이터베이스의 일관성이 깨지는 것을 방지해요.
즉, 유요하지 않은 포스트가 데이터베이스에 저장되는 것을 막는 것이 일관성이에요.

고립성 (Isolation) - 독립적인 작업 처리

포스트를 작성하고 게시하는 동시에 다른 블로그 관리자가 기존 포스트 내용을 수정하고 있고, 방문자는 블로그의 메인 페이지를 보고 있다고 가정할게요.

고립성 보장

포스트를 게시하는 트랜잭션은 다른 관리자의 수정 작업이나 방문자의 조회 작업에 영향을 주면 안돼요.
작성중인 포스트가 완전히 게시되기 전까지 다른 사용자들은 작성 또는 수정중인 작업물이나 불완전한 상태의 포스트를 볼 수 없어야 해요.
또한, 작성하는 동안, 다른 관리자의 수정 작업과 충돌해서도 안 되죠.
각 트랜잭션은 서로 독립적으로 실행되는 것처럼 동작하고, DBMS는 트랜잭션 처리의 순차성을 보장하기 위해 락(MVCC) 등의 메커니즘을 통해 이를 보장해요.

지속성 (Durability) - 영구적으로 저장

포스트를 작성하고 게시가 완료되었다고 가정할게요.

지속성 보장

게시가 완료된 포스트는 데이터베이스에 영구적으로 저장되어야 해요.
만약, 발행 직후에 서버에 장애가 발생하여 데이터베이스는 재부팅 후에도 게시된 포스트가 손실되지 않고 정상적으로 저장됨을 보장해야 해요.
이는 주로 트랜잭션 로그를 사용하여 기록된 내용을 바탕으로 데이터베이스를 복구하는 방식으로 이루어져요.
즉, 한번 커밋된 내용은 어떤 일이 있어도 사라지지 않아야 해요.