[DB] 트랜잭션과 ACID

1 minute read

트랜잭션이란

DB 내에서 하나의 논리적인 기능을 수행하는 단위로, 더이상 쪼갤 수 없는 작업의 논리적인 단위입니다.

ACID

트랜잭션이 만족해야하는 속성으로 ACID는 다음과 같습니다.

  • Atomicity
  • Consistency
  • Isolation
  • Durablility

원자성(Atomicity)

트랜젝션 내의 모든 연산들은 반드시 한꺼번에 완전하게 전체가 정상적으로 수행이 완료되거나 아니면 어떠한 연산도 수행되지 않은 all or noting으로 수행되어야 합니다. 예를 들어 게시판에 글을 Post할 때 Atomicity가 보장 된다는 것은 티스토리 데이터 베이스에 성공적으로 저장되거나, 실패하거나 2가지 경우밖에 없다는 것입니다. 글 내용의 절반만 저장되고 나머지는 저장안되는 경우를 없게 한다는 것입니다.

일관성(Consistency)

트랜잭션 작업이 시작되지 전에 데이터베이스 상태가 일관된 상태였다면 트랜잭션 작업이 종료된 후에도 일관성 있는 데이터 베이스 상태를 유지해아하는 속성입니다. 예를 들어서 티스토리 게시판에 글을 쓰는데 제목의 글자 제한이 255자라고 할 때, 트랜잭션이 일어나면 이러한 조건을 만족해야 합니다. 만약 이를 위반하는 트랜잭션이 있다면 거부해야합니다.

고립성(Isolation)

트랜잭션 작업 수행 중에는 다른 트랜잭션에 영향을 주어서도 안되고, 다른 트랜잭션들에 의해 간섭을 받아서도 안 된다는 것을 의미합니다. 다른 트랜잭션의 영향을 받게 되면 영향을 주는 트랜잭션에 의해 자신의 동작이 달라 질 수 있기 때문에, 트랜젝션 자신은 고립된 상태에서 수행되어야 한다는 것을 의미합니다. 즉 다수의 트랜잭션이 동시에 수행중인 상황에서 하나의 트랜잭션이 완료될 때까지는 현재 실행 중인 트랜잭션의 중간 수행결과를 다른 트랜잭션에서 보거나 참조 할 수 없습니다.

예를 들어서 모 커뮤니티의 자유게시판에 두 사람이 글을 거의 동시에 올린다고 하겠습니다. 그러면 두 트랜젝션에 충돌이 일어나서 User A의 제목이 저장되고 내용은 User B가 저장되는게 아니라 User A의 트랜잭션이 종료 되기 전까지 User B의 트랜젝션은 실행되지 않는 것을 말합니다.

지속성(Durablility)

일련의 데이터 조작(트렌젝션 조작)을 완료 하고 완료 통지를 사용자가 받는 시점에서 그 조작이 영구적이 되어 그 결과를 잃지 않는 것을 나타냅니다. 시스템이 정상일 때 뿐 아니라 데이터베이스나 OS의 이상 종료, 즉 시스템 장애도 견딜 수 있다는 것을 말합니다. MySQL을 포함해 많은 데이터베이스의 구현에서는 트랜젝션 조작을 하드 디스크에 로그로 기록하고 시스템에 이상이 발생하면 그 로그를 사용해 이상 발생 전까지 복원하는 것으로 지속성을 실현합니다.