개인 공부😊/Database

[데이터베이스] 4.3 트랜잭션과 무결성

송테이토 2022. 11. 27. 21:05

1. 트랜잭션이란?

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

즉 여러개의 쿼리들을 하나로 묶는 단위!

_트랜잭션이 보장해야 하는 ACID

원자성, 일관성, 격리성, 지속성

  • Atomicity(원자성) - all or nothing

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

한 트랜잭션 내에서 실행한 작업들은 하나의 작업으로 간주. 모두 성공 또는 실패되어야 한다.


  • Consistency(일관성)

→ ‘허용된 방식’으로만 데이터를 변경해야 하는 것(통장에 500원있는데 500만원 출금 X)


  • Isolation(격리성) :

→동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리

트랜잭션 수행 시 서로 끼어들지 못함!

_격리성 관련 문제점

1**) Non-Repeatable Read**

→한 트랜잭션 내의 같은 행에 두 번 이상 조회가 발생했는데 그 값이 다른 경우

한 트랜잭션(T1)이 데이터를 Read하고 있다. 이때 다른 트랜잭션(T2)가 데이터에 접근하여 값을 변경/삭제 후 커밋을 하면

그 후 T1이 다시 해당 데이터를 Read할 때 변경/삭제된 데이터를 찾게 된다.

예)

사용자 A는 총 신고수가 30개이다.

사용자 B가 그 값을 1로 커밋했다고 하면 사용자 A는 30이 아닌 1를 읽음

2**) Dirty Read**

→ **Non-Repeatable Read(**반복 가능하지 않은 조회)와 유사

한 트랜잭션(T1)이 데이터에 접근하여 값을 A에서 B로 변경했고, 아직 커밋을 하지 않았을 때

다른 트랜잭션(T2)이 해당 데이터를 Read하면

T2가 읽은 값은 B가 될 것. 하지만 T2가 가진 데이터는 꼬이게 된다.

예)

사용자 A 총 신고수가 30개를 1로 변경한 내용이 커밋되지 않아도 그 이후 사용자 B가 조회한 결과가 1로 나옴

3) Phantom Read

→ 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 것

트랜잭션(T1) 중에 특정 조건으로 데이터를 검색하여 결과를 얻었다.

이 때 다른 트랜잭션(T2)가 접근해 해당 조건의 데이터 일부를 삭제/추가 했을 때, 아직 끝나지 않은 T1이 해당 조건으로 데이터를 조회하면 T2에서 추가/삭제된 데이터가 함께 조회/누락 된다.

그 후 T2가 롤백을하면 데이터가 꼬인다.

예) 사용자가 급여 3000만원 이상 회원들 조회하는 쿼리를 보냄. 이 결과 테이블이 3개일때 다시 급여가 5000만원인 회원 레코드 삽입하면 네 개의 테이블이 조회된다.

트랙잭션 격리 수준

위와 같은 문제들 때문에, ANSI표준에서 트랜잭션의 격리성과 동시 처리 성능 사이의 Trade-off를 두고 4단계 격리수준을 나누었다.

내려갈수록 격리 수준이 높아져서 언급된 이슈는 적게 발생하지만 동시 처리 성능은 떨어진다.

참고로, 트랜잭션이 발생하면 락(Lock)이 걸리는데,

SELECT 시에는 공유 락,

CREATE/INSERT/DELETE 시에는 배타적 락이 걸린다

1) Read Uncommitted (가장 낮은 수준의 격리 수준, 이슈 자주 발생)

커밋하지 않은 데이터를 읽을 수 있다.

데이터 무결성을 위해 되도록이면 사용하지 않는 것이 이상적이나, 몇몇 행이 제대로 조회되지 않더라도 괜찮은 거대한 양의 데이터를 ‘어림잡아’ 집계하는데 사용하면 좋다.

이 수준은 당연히 위에서 언급한 모든 문제에 대해 발생 가능성이 존재한다.

발생 문제점 : Dirty Read, Non-Repeatable Read, Phantom Read

2) Read Committed

커밋이 완료된 데이터만 읽을 수 있다.

가장 많이 사용되는 격리 수준! 오라클,MySQL 8.0등 기본값으로 설정되어있음

Dirty Read가 발생할 여지는 없으나, Uncommitted Read 수준보다 동시 처리 성능은 떨어진다.

발생 문제점 : Non-Repeatable Read, Phantom Read

3) Repeatable Read

트랜잭션 내에서 한 번 조회한 데이터를 반복해서 조회해도 같은 데이터가 조회된다.

하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 막아주지만 새로운 행을 추가하는 것은 막지 않는다. 따라서 이후에 추가된 행이 발견될 수 있다.

이는 개별 데이터 이슈인 Dirty Read, Non-Repeatable Read는 발생하지 않지만,

발생 문제점 : Phantom Read

4) Serializable

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

가장 엄격한 격리 수준. 여러 트랜잭션이 동시에 같은 행에 접근할 수 없다.

그렇기 때문에 교착 상태가 일어날 확률도 많고, 가장 성능이 떨어지는 격리 수준이다.

위 3가지 문제점을 모두 커버 가능하다. 하지만 동시 처리 성능은 급격히 떨어질 수 있다.

참고로 MySQL과 Oracle의 격리 수준은 다르다.

  • MySQL : Repeatable Read
  • Oracle : Read Committed

  • Durability(지속성)

→트랜잭션을 성공적으로 마치면 그 결과가 항상 저장되어야 한다.

이는 시스템 장애가 발생해도 원래 상태로 복구되는 회복성이 있어야 함을 뜻한

ex) 체크섬, 저널링, 롤백

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

저널링 : 데이터베이스 시스템에 변경사항을 커밋하기 전에 로깅하는 것!

트랜잭셩 등 변경 사항에 대한 로그를 남기는것


2. 무결성

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

무결성이 유지되어야 데이터베이스에 저장된 값과 그 값에 해당하는 현실 세계의 실제 값이 일치하는지에 대한 신뢰가 생긴다.

1) 개체 무결성 (Entity integrity)

모든 테이블이 기본 키 (primary key)로 선택된 필드 (column)를 가져야 한다. 기본 키로 선택된 필드는 고유한 값을 가져야 하며, 빈 값(NULL)은 허용하지 않는다.

2) 참조 무결성 (Referential integrity)

관계형 데이터베이스 모델에서 참조 무결성은 참조 관계에 있는 두 테이블의 데이터가 항상 일관된 값을 갖도록 유지되는 것을 말한다.

아래의 [그림 1]은 관계형 데이터베이스 모델에서 참조 무결성이 깨지는 경우를 나타낸다.

만약 department 테이블에서 id 값이 310인 레코드가 삭제되면 student 테이블의 3번째 레코드는 더 이상 존재하지 않는 데이터를 참조하게 된다.

https://t1.daumcdn.net/cfile/tistory/2658C14D5827CB181E

3) 도메인 무결성 (Domain integrity)

, NULL값의 허용 등에 대한 사항을 정의하고, 올바른 데이터의 입력 되었는지를 확인하는 것이다.

예를 들어, 주민등록번호 필드에 알파벳이 입력되는 경우는 도메인 무결성이 깨지는 경우라고 볼 수 있다. DBMS의 기본값 설정, NOT NULL 옵션 등의 제약 사항으로 도메인 무결성을 보장할 수 있다.

4) 무결성 규칙 (Integrity rule)

데이터베이스에서 무결성 규칙은 데이터의 무결성을 지키기 위한 모든 제약 사항들을 말한다. 비즈니스 규칙 (business rule)은 데이터베이스를 이용하는 각각의 유저에 따라 서로 다르게 적용되지만, 무결성 규칙은 데이터베이스 전체에 공통적으로 적용되는 규칙이다.