본문 바로가기
TIL/CS

트랜잭션과 무결성

by J1-H00N 2023. 10. 25.
  • 트랜잭션
    • 데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위를 말하며 데이터베이스에 접근하는 방법은 쿼리이므로, 여러 개의 쿼리들을 하나로 묶는 단위를 말한다.
    • 원자성, 일관성, 독립성, 지속성의 특징이 있으며 이를 하나로 묶어 ACID라고 한다.
      • 원자성
        • "all or nothing"
        • 트랜잭션과 관련된 일이 모두 수행되었거나 되지 않았거나를 보장하는 특징이다.
        • 예를 들어 트랜잭션을 커밋했는데, 문제가 발생하여 롤백하는 경우 그 이후에 모두 수행되지 않음을 보장하는 것이다.
        • 트랜잭션 단위로 여러 로직들을 묶을 때 외부 API를 호출하는 것이 있으면 안된다. 만약 있다면 롤백이 일어났을 때 어떻게 해야 할 것인지에 대한 해결 방법이 있어야 하고 트랜잭션 전파를 신경 써서 관리해야 한다.
        • 커밋 - 여러 쿼리가 성공적으로 처리되었다고 확정하는 명령어이다. 트랜잭션 단위로 수행되며 변경된 내용이 모두 영구적으로 저장되는 것을 말한다.
        • 롤백 - 트랜잭션으로 처리한 하나의 묶음 과정을 일어나기 전으로 돌리는 일을 말한다.
        • 커밋과 롤백 덕에 데이터의 무결성이 보장되며, 데이터 변경 전에 변경 사항을 쉽게 확인할 수 있고 해당 작업을 그룹화할 수 있다.
        • 트랜잭션 전파
          • 트랜잭션을 수행할 때 커넥션 단위로 수행하기 때문에 커넥션 객체를 넘겨서 수행해야 한다.
          • 하지만 이를 매번 넘겨주기도 어렵고 귀찮기 때문에 이를 넘겨서 수행하지 않고 여러 트랜잭션 관련 메서드의 호출을 하나의 트랜잭션에 묶이도록 하는 것을 트랜잭션 전파라고 한다.
      • 일관성
        • 허용된 방식으로만 데이터를 변경해야 하는 것을 의미한다.
        • 데이터베이스에 기록된 모든 데이터는 여러 가지 조건, 규칙에 따라 유효함을 가져야 한다.
      • 격리성
        • 트랜잭션 수행 시 서로 끼어들지 못하는 것을 의미한다.
        • 복수의 병렬 트랜잭션은 서로 격뢰되어 마치 순차적으로 실행되는 것처럼 작동되어야 하고, 데이터베이스는 여러 사용자가 같은 데이터에 접근할 수 있어야 한다.
        • 여러 개의 격리 수준으로 나누어 격리성을 보장한다. 또한, 각 단계마다 나타나는 현상이 있다.
          • SERIALIZABLE(격리성이 가장 높고 동시성이 가장 낮다.)
            • 트랜잭션을 순차적으로 진행시키는 것을 말한다.
            • 여러 트랜잭션이 동시에 같은 행에 접근할 수 없다.
            • 매우 엄격한 수준으로 해당 행에 대해 격리시키고, 이후 트랜잭션이 이 행에 대해 일어난다면 기다려야 한다.
            • 교착 상태가 일어날 확률도 많고 가장 성능이 떨어진다.
          • REPEATABLE_READ
            • 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 막아주지만 새로운 행을 추가하는 것은 막지 않는다.
            • 이후에 추가된 행이 발견될 수도 있다.
            • 팬텀 리드 현상이 발생할 수 있다.
          • READ_COMMITTED
            • 가장 많이 사용되는 격리 수준이며 MySQL8.0, PostgreSQL, SQL Server, 오라클에서 기본값으로 설정되어 있다.
            • 다른 트랜잭션이 커밋하지 않은 정보는 읽을 수 없고, 커밋 완료된 데이터에 대해서만 조회를 허용한다.
            • 하지만 어떤 트랜잭션이 접근한 행을 다른 트랜잭션이 수정할 수 있다. 때문에 한 트랜잭션이 같은 행을 다시 읽을 때 다른 내용이 발견될 수 있다.
            • 팬텀 리드, 반복가능하지 않은 조회 현상이 발생할 수 있다.
          • READ_UNCOMMITTED(격리성이 가장 낮고 동시성이 가장 높다.)
            • 가장 낮은 격리 수준으로, 하나의 트랜잭션이 커밋되기 이전에 다른 트랜잭션에 노출되는 문제가 있으나 가장 빠르다.
            • 데이터 무결성을 위해 되도록이면 사용하지 않는 것이 이상적이나 몇몇 행이 제대로 조회되지 않더라도 괜찮은 거대한 양의 데이터를 어림잡아 집계하는 데는 사용하면 괜찮다.
            • 팬텀 리드, 반복 가능하지 않은 조회, 더티 리드가 발생할 수 있다.
              • 팬텀 리드 - 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 경우를 말한다.
              • 반복 가능하지 않은 조회 - 한 트랜잭션 내의 같은 행에 두 번 이상 조회가 발생했는데, 그 값이 다른 경우를 말한다. 반복 가능하지 않은 조회는 행 값이 달라질 수 있으나 팬텀리드는 다른 행이 선택될 수도 있다.
              • 더티 리드 - 반복 가능하지 않은 조회와 유사하며 한 트랜잭션이 실행 중일 때 다른 트랜잭션에 의해 수정되었지만 아직 커밋되지 않은 행의 데이터를 읽을 수 있을 때 발생한다.
      • 지속성
        • 성공적으로 수행된 트랜잭션은 영원히 반영되어야 하는 것을 의미한다.
        • 데이터베이스에 시스템 장애가 발생해도 원래 상태로 복구하는 회복 기능이 있어야 함을 뜻하며, 데이터베이스는 이를 위해 체크섬, 저널링, 롤백 등의 기능을 제공한다.
          • 체크섬 - 중복 검사의 한 형태로, 오류 정정을 통해 송신된 자료의 무결성을 보호하는 단순한 방법
          • 저널링 - 파일 시스템 또는 데이터베이스 시스템 변경 사항을 반영하기 전 로깅하는 것, 트랜잭션 등 변경 사항에 대한 로그를 남기는 것
    • 무결성
      • 데이터의 정확성, 일관성, 유형성을 유지하는 것을 말하며 무결성이 유지 되어야 해당 데이터에 대한 신뢰성이 생긴다.
      • 무결성의 종류
        • 개체 무결성 - 기본키로 선택된 필드는 빈 값을 허용하지 않는다.
        • 참조 무결성 - 서로 참조 관계에 있는 두 테이블의 데이터는 항상 일관된 값을 유지해야 한다.
        • 고유 무결성 - 특정 속성에 대해 고유한 값을 가지도록 조건이 주어진 경우 그 속성 값은 모두 고유한 값을 가진다.
        • NULL 무결성 - 특정 속성 값에 NULL이 올 수 없다는 조건이 주어진 경우 그 속성 값은 NULL이 될 수 없다는 제약 조건이다.

'TIL > CS' 카테고리의 다른 글

조인  (0) 2023.10.25
데이터베이스의 종류/ 인덱스  (0) 2023.10.25
ERD와 정규화 과정  (0) 2023.10.24
데이터베이스  (0) 2023.10.24
CPU 스케줄링 알고리즘  (0) 2023.10.24