[CS/DB] 트랜잭션이란? 특성 및 ACID 성질

나른한 개발자·2023년 7월 24일
0

CS

목록 보기
10/11
post-custom-banner

트랜잭션이란?

데이터베이스의 상태를 변화시키기 위한 하나의 작업 단위 또는 한번에 실행되어야 할 일련의 연산


트랜잭션의 특징

  • 트랜잭션은 데이터베이스 시스템의 병행제어 또는 회복 작업 시 처리되는 작업 단위이다.
  • 하나의 트랜잭션은 Commit 되거나 Rollback 된다.

성질 (ACID)

Atomicity: 원자성

하나의 트랜잭션은 모두 반영되거나 모두 반영되지 않아야 한다. 트랜잭션 연산 중 일부는 실행되었더라도 나머지 연산이 비정상적으로 처리되었다면 트랜잭션 실행 전 상태로 돌아가야한다.

수행하고 있는 트랜잭션에 의해 변경된 내용을 유지하면서 이전에 commit 된 내역을 롤백 세그먼트 영역에 임시 저장하고 있다가 트랜잭션 수행 중 오류가 발행하면 변경 사항을 폐기하고 임시 저장한 최근 commit 시점으로 rollback 한다.

이때, 트랜잭션이 너무 길다면 모든 연산을 재수행하는데에 비용이 들기에 정상적인 처리가 확실한 부분에 대해서 save point를 지정할 수 있다.

save point를 이용하면 연산을 전체 재수행하는 것이 아닌 특정 부분에서 rollback 시킬 수 있다.

Consistency: 일관성

트랜잭션 처리 결과는 항상 일관성 있어야 한다.

예를 들어 게시판 글 테이블의 본문 제약조건이 글자 길이가 255자까지 였다면 트랜잭션이 실행된 후에도 이 조건이 유지되어야 한다.

즉, 데이터 모델의 모든 제약조건(기본키, 외래키, 도메인 제약조건 등)이 트랜잭션 실행 전후에 동일하게 유지되어야 한다.

트랜잭션에서의 일관성은 트리거를 통해 유지된다.

💡 트리거?

특정 테이블에 DML 명령이 실행되었을 경우 데이터베이스 내부에서 자동으로 실행되는 프로그램. 예를 들어 하나의 테이블이 수정되었을 때 다른 테이블에도 수정이 일어나도록 업데이트를 하는 명령 등으로 구성되어 있다.

Isolation: 격리성, 독립성

둘 이상의 트랜잭션이 병행 실행되고 있을 경우, 하나의 트랜잭션이 실행되는 중에 다른 트랜잭션에 의해 간섭받을 수 없다.

하나의 트랜잭션이 모두 처리되기 전까지 다른 트랜잭션이 처리 값을 참조할 수 없다. 격리성은 Lock & Unlock 기법을 사용해 보장된다.

💡 Lock & Unlock

데이터 읽기 또는 쓰기 작업 중일 경우 다른 트랜잭션이 접근하지 못하게 하고 먼저 들어온 트랜잭션의 요청이 끝나면 unlock하여 다른 트랜잭션의 접근을 허용하는 기법이다. Lock을 잘못 사용하면 어떠한 트랜잭션도 수행할 수 없게 되는 데드락(Dead Lock) 상태에 빠지게 된다.

Durablitiy: 지속성, 영속성

트랜잭션 수행 결과는 시스템이 고장나더라도 데이터베이스에 영구적으로 반영되어야 한다.

트랜잭션이 성공적으로 종료되어 commit이 되면 이 결과는 데이터베이스에 영구히 반영되어야 한다.


연산

Commit

트랜잭션 연산이 모두 성공적으로 마무리되어 트랜잭션 관리자에게 처리가 끝났음을 알리는 연산이다.

Rollback

트랜잭션 실행 중 비정상적으로 종료되었을 시, 연산의 일부는 성공하였더라도 모든 연산을 실행 취소하는 연산이다.


활용 예시

송금

  • 입금자의 계좌에서 보내는 금액만큼 차감한다.
  • 예금주의 계좌를 증액한다.

상품 재고 업데이트

  • 재고수에서 팔린 개수만큼 수를 줄인다.
  • 거래 테이블을 수정한다.

항공권 예약

  • 사용자가 좌석을 예약한다.
  • 이용 금액을 결제한다.
profile
Start fast to fail fast
post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 7월 24일

많은 도움이 되었습니다, 감사합니다.

답글 달기