[DB] ACID란?

2021. 7. 4. 10:46·스터디/Database
728x90

데이터베이스하면 항상 따라다니는 기본 개념인 ACID에 대해 정리해본다.

 

트랜잭션은 DB 서버에 여러 개의 클라이언트가 동시에 액세스 하거나 응용프로그램이 갱신을 처리하는 과정에서 중단될 수 있는 경우 등 데이터 부정합을 방지하고자 할 때 사용한다. 부정합이 발생하지 않으려면 프로세스를 병렬로 처리하지 않도록 하여 한 번에 하나의 프로세스만 처리하도록 하면 되는데, 이는 효율이 너무 떨어진다. 병렬로 처리할 수 밖에 없는 현실적인 상황으로 인해 부정합을 방지하고자 트랜잭션을 사용하는 것입니다. 자세한 내용은 https://hyeri0903.tistory.com/169?category=772718 에 정리해두었다.

 

ACID(원자성, 일관성, 고립성, 지속성)는 데이터베이스 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질을 가리키는 약어이다. 짐그레이즞 1970년대 말에 신뢰할 수 있는 트랜잭션 시스템의 이러한 특성들을 정의하였으며 자동으로 이들을 수행하는 기술을 개발해 냈다. (출처 : 위키백과)

 

ACID
  • 원자성(Atomicity): 트랜잭션에 포함된 작업은 전부 수행되거나 전부 수행되지 않아야 한다.
  • 일관성(Consistency): 트랜잭션을 수행하기 전이나 후나 데이터베이스는 항상 일관된 상태를 유지해야 한다.
  • 고립성(Isolation): 수행 중인 트랜잭션에 다른 트랜잭션이 끼어들어 변경중인 데이터 값을 훼손하지 않아야한다.
  • 지속성(Durability) : 수행을 성공적으로 완료한 트랜잭션은 변경한 데이터를 영구히 저장해야 한다.

 

 

최근까지 DB들은 대부분 ACID를 보장하기 위해 락(lock)에 의존했다. 이것은 데이터 처리전에 언제나 락이 필요함을 의미한다. 많은 수의 락을 관리하게 되면 동시작업 수행이 어렵고 성능저하를 초래하게 된다. A유저가 특정 테이블을 읽고 있다면 B유저는 A의 트랜잭션이 끝나기를 기다려야 한다. (락에대한 설명은 https://hyeri0903.tistory.com/176?category=772718 에 정리해두었다.)

 

락의 대안으로 수정되는 모든 데이터를 별도 복사본으로 관리하는 MVCC(Multiversion Concurrency Control , 다중 버전 동시성 제어)가 있다. 방금 전 언급한 A,B 유저의 예를 들면 A가 트랜잭션을 시작할 때 가지고 있던 복사본을 B에 제공하여 동시에 수행이 가능하다. (Snapshot 데이터 이용). 이 방식은 사용자들이 데이터 처리하는 데 있어 많은 유연성을 제공한다. MVCC 방식은 Snapshot을 이용하여 Locking을 필요하지않으므로 일반적인 RDBMS 보다 더 빠른 동작이 가능하다. 또한 데이터를 읽기 시작 할 때 그 데이터를 삭제, 수정하더라도 영향을 받지 않고 데이터를 사용할 수 있다.

 

네트워크 환경에서 ACID특성을 보장하는 것은 어렵다. 연결이 끊길 수도 있고 두 사용자가 동시에 DB의 동일한 부분을 접근할 수도 있다

트랜잭션의 commit 여부를 각 사용자로부터 확인하기 위해 2단계 commit이 분산 트랜잭션에 적용된다. 트랜잭션이 병렬 수행되는 경우 많은 주의가 필요하다. 2단계 락은 완전한 독립성을 보장하기 위해 사용된다.

 


참고:

https://victorydntmd.tistory.com/129

 

[DB이론] 트랜잭션(transaction)과 ACID 특성을 보장하는 방법

1. 트랜잭션( transaction ) 트랜잭션이란 질의(query)를 하나의 묶음 처리해서 만약 중간에 실행이 중단됐을 경우, 처음부터 다시 실행하는 Rollback을 수행하고, 오류없이 실행을 마치면 commit을 하는

victorydntmd.tistory.com

 

728x90

'스터디 > Database' 카테고리의 다른 글

[DB] MySQL CharacterSet과 Collation  (0) 2022.11.12
[MySQL] 다중 테이블 업데이트, 여러 테이블 update 하기  (1) 2022.10.06
[DB] 정규화 vs 반정규화(비정규화)  (0) 2021.07.04
[DB] Locking (잠금 기법)  (0) 2021.05.28
[DB] 데이터 정규화 1NF, 2NF, 3NF, BCNF  (0) 2021.05.28
'스터디/Database' 카테고리의 다른 글
  • [DB] MySQL CharacterSet과 Collation
  • [MySQL] 다중 테이블 업데이트, 여러 테이블 update 하기
  • [DB] 정규화 vs 반정규화(비정규화)
  • [DB] Locking (잠금 기법)
zoodi
zoodi
IT/개발 관련 지식을 기록하는 블로그입니다.
  • zoodi
    오늘의 기록
    zoodi
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 후기
        • 컨퍼런스
        • 일상리뷰
      • 금융경제
        • 뉴스
        • 금융IT용어
        • 경제 및 부동산
      • 코딩 테스트
      • 스터디
        • JAVA
        • Kotlin
        • Spring
        • React, Nextjs
        • 인공지능 AI
        • Cloud & k8s
        • Kafka
        • Database
        • Network
        • Algorithm
        • Hadoop
        • LINUX
        • R Programming
        • 기타 (소공, 보안)
      • 도서
      • 기타
  • 블로그 메뉴

    • 홈
    • 스터디
    • 금융경제
    • 후기
    • 기타
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    스프링
    코딩
    C++
    Python
    db
    코딩테스트
    자료구조
    쿠버네티스
    코딜리티
    Spring
    이분탐색
    코테공부
    프로그래머스
    codility
    카카오코테
    자바
    Kotlin
    java
    스프링부트
    pythoncodingtest
    네트워크
    리트코드
    코테
    CodingTest
    금융용어
    MySQL
    알고리즘
    springboot
    kafka
    LeetCode
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
zoodi
[DB] ACID란?
상단으로

티스토리툴바