[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

💻 CS/데이터베이스

[DB] 트랜잭션과 ACID

inu 2021. 12. 31. 12:34
반응형

트랜잭션이란?

트랜잭션은 데이터베이스에서 쪼갤 수 없는 업무처리의 최소 단위를 말합니다. 하나의 트랜잭션은 데이터베이스에 읽거나 쓰는 여러 개의 쿼리를 요구하는데, 이때 하나의 쿼리가 실패하면 데이터베이스 시스템은 전체 트랜잭션 혹은 실패한 쿼리를 롤백합니다.

트랜잭션의 연산

Commit

하나의 트랜잭션 작업이 끝나고 데이터베이스가 일관성이 유지되었음이 확인될 때, 이를 트랜잭션 관리자에게 알리는 연산입니다.

Rollback

하나의 트랜잭션 작업이 비정상적으로 종료되고 일관성이 깨졌을 때, 트랜잭션의 모든 연산을 취소하는 연산입니다. Rollback 연산이 수행되면 해당 트랜잭션은 아예 취소되거나 폐기됩니다.

Savepoint

Rollback 연산 수행 시 일반적으로는 전체 연산이 삭제되지만, 이 연산을 사용하면 특정 부분의 트랜잭션만을 취소하는 것이 가능해집니다. Savepoint를 명시한 다음 Rollback 연산을 수행하면 해당 Savepoint 이후의 작업들만 취소됩니다.

트랜잭션의 상태

  • 활동(Active) : 트랜잭션이 실행 중인 상태입니다.
  • 실패(Failed) : 트랜잭션 실행에 오류가 발생하여 중단된 상태입니다.
  • 철회(Aborted) : 트랜잭션이 비정상적으로 종료되어 롤백 연산을 수행한 상태입니다.
  • 부분 완료(Partially Committed) : 트랜잭션의 마지막 연산까지 실행했지만, 커밋 연산이 실행되기 직전의 상태입니다.
  • 완료(Committed) : 트랜잭션이 성공적으로 종료되어 커밋 연산을 실행한 후의 상태입니다.

ACID

트랜잭션이 안전하게 처리되기 위해서는 'ACID'라고 불리는 성질들을 만족해야 하는데, 이는 Atomicity(원자성), Consistency(일관성), Isolation(고립성), Durability(지속성)의 약자입니다.

Atomicity(원자성)

Atomicity(원자성)은 트랜잭션 연산이 더 이상 쪼개지지 않고 하나로 처리되는 것을 의미합니다. 이 원칙에 따라 트랜잭션 연산은 모두 반영되던지, 아니면 전혀 반영되지 않습니다.

 

이러한 원자성은 수행하고 있는 트랜잭션에 의해 변경된 내역을 유지하면서 이전 데이터베이스의 상태를 임시 영역에 저장함으로써 보장합니다. 만약 트랜잭션 도중 오류가 발생하면 임시 영역에 저장된 상태로 롤백하는 것입니다. 이러한 임시 영역을 롤백 세그먼트라고 합니다.

 

트랜잭션 길이가 길어지게 되면 오류가 발생하지 않아도 되는 부분까지 롤백이 될 수 있는데, 이를 위해 세이브포인트라는 연산이 존재합니다. 세이브포인트를 지정하면 롤백 시 세이브포인트 이전은 확실하다고 간주하고 처리됩니다.

Consistency(일관성)

Consistency(일관성)은 특정 트랜잭션 연산이 일관적인 데이터베이스 상태를 유지하는 것을 뜻합니다. 시스템의 고정 요소는 수행 전과 수행 후가 같아야 하고 트랜잭션의 작업 처리 결과는 항상 일관적이어야 합니다. 트랜잭션 도중 데이터베이스가 변경되어도 변경 전 처음 트랜잭션 시작 시 참조한 데이터베이스로 진행됩니다. 고정 요소의 예시로는 기본 키 및 외래 키 제약과 같은 무결성 제약뿐 아니라, A에서 B로 돈을 이체할 때 계좌의 총합이 같아야 하는 등의 비명시적 조건도 포함됩니다.

 

일관성은 데이터베이스의 트리거 기능을 통해 수행됩니다. 트리거는 특정 테이블에 INSERT, DELETE, UPDATE 등의 DML문이 수행되었을 때, 데이터베이스가 자체적으로 자동 실행하도록 작성된 프로그램입니다. 즉, 사용자가 직접 호출하지 않고 자동 호출되기 때문에 이를 활용하면 시스템의 고정 요소를 유지할 수 있습니다.

Isolation(고립성)

Isolation(고립성)은 하나의 트랜잭션이 수행될 때 다른 트랜잭션 작업이 끼어들지 않도록 보장하는 것입니다. 트랜잭션 실행 중 변경한 데이터는 해당 트랜잭션 완료시까지 다른 트랜잭션이 참조할 수 없습니다. 예를 들어 하나의 트랜잭션이 특정 계좌에 대한 작업을 하고 있을 경우 다른 트랜잭션은 해당 계좌에 대한 작업을 수행할 수 없고 대기해야 하는 것을 말합니다.

 

고립성은 OS의 세마포어와 비슷한 개념으로 lock&unlock을 통해 보장할 수 있습니다. 데이터를 사용할 때는 lcok을 통해 문을 잠궈서 고립성을 보장하고 수행을 마치면 unlock을 통해 접근을 허용하는 방식입니다.

 

데이터를 읽을 때는 쓰기만 금지하고 읽기는 허용하는 shared_lock을 수행하고, 데이터를 쓸 때는 쓰기와 읽기 모두를 금지하는 exclusive_lock을 수행합니다. 단, lock과 unlock을 잘못 처리하면 아무 작업도 처리되지 않는 deadlock이 발생할 수 있으니 주의해야 합니다.

Durability(지속성)

Durability(지속성)은 트랜잭션 작업 종료 후 작업의 결과가 데이터베이스에 영구적으로 저장되어야 하는 것을 의미합니다. 트랜잭션 완료 시 해당 작업 내역은 저장장치에 확실하게 기록되어야 하며, DBMS가 이를 책임지고 수행합니다.


참고

반응형

'💻 CS > 데이터베이스' 카테고리의 다른 글

[DB] Index  (0) 2022.01.26
Python으로 Mysql 다루기 (pymysql)  (2) 2021.06.07
개체와 속성  (0) 2021.05.04
데이터베이스 모델링 개념  (0) 2021.05.02
Mysql - 기초명령어 정리  (0) 2021.01.20