CS 전공지식/데이터 베이스

3. 트랜젝션과 무결성

eunjineee 2023. 8. 10. 18:26

1. 트랜잭션이란?

데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위

데이터베이스에 접근하는 방법은 쿼리이므로, 즉 여러 개의 쿼리들을 하나로 묶는 단위를 말함

 

ACID 특징

원자성, 일관성, 독립성, 지속성

 

 

원자성(atomicity)

all or nothing

트랜잭션과 관련된 일이 모두 수행되었거나 되지 않았거나를 보장하는 특징

ex) 트랜잭션을 커밋했는데, 문제가 발생하여 롤백하는 경우 그 이후에 모두 수행되지 않음을 보장하는 것

 

[주의사항]

트랜잭션 단위로 여러 로직들을 묶을 때 외부 API를 호출하는 것이 있으면 안 됨

만약 있다면 롤백이 일어났을 때 어떻게 해야 할 것인지에 대한 해결 방법이 있어야 하고 트랜잭션 전파를 신경 써서 관리해야 함

 

커밋과 롤백

  • 데이터의 무결성이 보장
  • 데이터 변경 전에 변경 사항을 쉽게 확인 가능, 해당 작업을 그룹화할 수 있음

커밋(commit)

여러 쿼리가 성공적으로 처리되었다고 확정하는 명령어

트랜잭션 단위로 수행되며 변경된 내용이 모두 영구적으로 저장되는 것

“커밋이 수행되었다.” ==  “하나의 트랜잭션이 성공적으로 수행되었다.”

 

롤백

트랜잭션으로 처리한 하나의 묶음 과정을 일어나기 전으로 돌리는 일(취소)

 

트랜잭션 전파

트랜잭션을 수행할 때 커넥션 단위로 수행하기 때문에 커넥션 객체를 넘겨서 수행해야 하는데, 이를 넘겨서 수행하지 않고 여러 트랜잭션 관련 메서드의 호출을 하나의 트랜잭션에 묶이도록 하는 것

@Service
@Transactional(readOnly = true)      //아래의 과정이 완료된 후 저장되도록 조건을 줌
public class MemberService {
    private final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

 

일관성(consistency)

트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 변환함

시스템이 가지고 있는 고정요소는 트랜잭션 수행 전과 트랜잭션 수행 완료 후의 상태가 같아야 함

 

격리성(isolation)

둘 이상의 트랜잭션이 동시에 병행 실행되는 경우 어느 하나의 트랜잭션 실행중에 다른 트랜잭션의 연산이 끼어들 수 없음

수행중인 트랜잭션은 완전히 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조할 수 없음

 

격리 수준 종류

 

SERIALIZABLE

말 그대로 트랜잭션을 순차적으로 진행시키는 것

여러 트랜잭션이 동시에 같은 행에 접근할 수 없음

교착 상태가 일어날 확률도 많고 가장 성능이 떨어지는 격리 수준

 

REPEATABLE_READ

하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 막아줌

새로운 행을 추가하는 것은 막지 않음 (이후에 추가된 행이 발견될 수도 있음)

 

READ_COMMITTED

가장 많이 사용되는 격리 수준

MySQL8.0, PostgreSQL, SQL Server, 오라클에서 기본값

커밋 완료된 데이터에 대해서만 조회를 허용

어떤 트랜잭션이 접근한 행을 다른 트랜잭션이 수정할 수 있음

 

READ_UNCOMMITTED

가장 낮은 격리 수준

장점 

가장 빠름

거대한 양의 데이터를 ‘어림잡아’ 집계하는 데는 사용하면 좋음

단점

하나의 트랜잭션이 커밋되기 이전에 다른 트랜잭션에 노출

 데이터 무결성을 위해 되도록이면 사용하지 않는 것이 이상적

 

지속성(durability)

성공적으로 수행된 트랜잭션은 영원히 반영되어야 하는 것

데이터베이스에 시스템 장애가 발생해도 원래 상태로 복구하는 회복 기능이 있어야 함을 뜻함

데이터베이스는 이를 위해 체크섬, 저널링, 롤백 등의 기능을 제공

 

**체크섬 : 중복 검사의 한 형태로, 오류 정정을 통해 송신된 자료의 무결성을 보호하는 단순한 방법

**저널링 : 파일 시스템 또는 데이터베이스 시스템에 변경 사항을 반영(commit)하기 전에 로깅하는 것, 트랜잭션 등 변경 사항에 대한 로그를 남기는 것

 

2. 무결성이란?

데이터의 정확성, 일관성, 유효성을 유지하는 것

무결성의 종류

  1. 개체 무결성 : 각 릴레이션의 기본키를 구성하는 속성은 널(NULL) 값이나 중복된 값을 가질 수 없습니다.
  2. 참조무결성 : 외래키 값은 NULL이거나 참조하는 릴레이션의 기본키 값과 동일해야 합니다.
                         서로 참조 관계에 있는 두 테이블의 데이터는 항상 일관된 값을 유지해야 합니다.
  3. 도메일 무결성 : 속성들의 값은 정의된 도메인에 속한 값이어야 합니다.
  4. 고유 무결성 : 특정 속성에 대해 고유한 값을 가지도록 조건이 주어진 경우, 릴레이션의 각 튜플이 가지는 속성 값들은 서로 달라야 합니다.
  5. NULL 무결성 : 릴레이션의 특정 속성 값은 NULL 될 수 없습니다.
  6. 키 무결성 : 각 릴레이션은 최소한 한 개 이상의 키가 존재해야 합니다.