✅ 트랜잭션
: 데이터베이스의 상태를 변경시키기 위해 수행하는 작업 단위
여러 개의 쿼리들을 하나로 묶은 단위라고 말한다
** 쿼리 : 데이터 베이스에 접근하는 방법
✅ 트랜잭션의 전파
: 트랜잭션을 수행할 때 커넥션 객체를 넘겨서 수행하지 않고 여러 트랜잭션 관련 메서드의 호출을 하나의 트랜잭션에 묶이도록 하는 것
✅ 트랜잭션 ACID 특징
1️⃣ 원자성 Atomicity
: 트랜잭션이 DB에 모두 반영되거나 ,전혀 반영되지 않거나를 뜻한다.
예시) 트랜잭션을 커밋했는데, 문제가 발생하여 롤백하는 경우 그 이후에 모두 수행되지 않음을 보장하는 것을 말한다
💡 커밋이란?
여러 쿼리가 성공적으로 처리되었다고 확정하는 명령어 트랜잭션 단위로 수행되며 변경된 내용이 모두 영구적으로 저장되는 것
💡롤백이란?
트랜잭션으로 처리한 하나의 묶음 과정을 일어나기 전으로 돌리는 일(취소)
💡커밋과 롤백의 장점은?
데이터 무결성 보장데이터 변경 전 변경사항을 쉽게 확인할 수 있고 해당 작업을 그룹화 할 수 있다.
2️⃣ 일관성 Consistency
: ‘트랜잭션 작업 처리의 결과가 항상 일관되어야한다는 뜻
즉, 데이터 타입이 반환 후와 전이 항상 동일해야 한다.
데이터베이스에 기록된 모든 데이터는 여러가지 조건, 규칙에 따라 유효함을 가져야한다.
3️⃣ 독립성 Isolation
: 하나의 트랜잭션은 다른 트랜잭션에 끼어들 수 없고 마찬가지로 독립적임을 의미한다.
즉, 각각의 트랜잭션은 독립적이라 서로 간석이 불가능하다.
📌 여러 개의 격리 수준 📌
팬텀 리드
: 팬텀리드는 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 경우
반복하지 않은 조회
: 한 트랜잭션 내의 같은 행에 두 번 이상 조회가 발생했는데, 그 값이 다른 경우
더티 리드
: 반복 가능하지 않은 조회와 유사하며 한 트랜잭션이 실행 중 일 때 다른 트랜잭션에 의해 수정되었지만 아직 ‘커밋되지 않은’ 행의 데이터를 읽을 수 있을 때 발생한다.
격리 수준
: 트랜잭션을 순차적으로 진행 시키는 것. 여러 트랜잭션이 동시에 같은 행에 접근할 수 없다.
매우 엄격한 수준으로 해댕 행에 대해 격리시키고, 이후 트랜잭션이 이 행에 대해 일어난다면 기다려야한다. 교착상태가 일어날 확률도 많고 가장 성능이 떨어지는 격리수준이다
REPEATABLE_READ
: 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 막아주지만 새로운 행을 추가하는 것은 막지 않는다. 따라서 이후에 추가된 행이 발결될 수도 있다.
READ_COMMITTED
: 가장 많이 사용되는 격리수준. 다른 트랜잭션이 커밋하지 않은 정보를 읽을 수 없습니다.
즉, 커밋 완료된 데이터에 대해서만 조회를 허용한다.
READ_UNCOMMITTED
: 가장 낮은 격리 수준으로, 하나의 트랜잭션이 커밋되기 이전에 다른 트랜잭션에 노출되는 문제가 있지만 가장 빠르다. 데이터 무결성을 위해 되도록이면 사용하지 않는 것이 이상적이나, 몇몇 행이 조회되지 않더라도 괜찮은 거대한 양의 데이터를 어림잡아 집계하는 데는 사용하는 것이 좋다.
4️⃣ 지속성 Durability
: 성공적으로 수행된 트랜잭션은 영원히 반영되어야 하는 것
데이터베이스에 시스템 장애가 발생해도 원래 상태로 복구하는 회복 기능이 있어야한다.
데이터베이스는 이를 위해 체크섬, 저널링, 롤백 등의 기능을 제공한다.
<aside> 💡 체크섬이란? 중복검사의 한 형태로, 오류 정정을 통해 송신된 자료의 무결성을 보호하는 단순한 방법
저널링이란? 파일 시스템 또는 데이터베이스 시스템에 변경사항을 반영(커밋)하기 전에 로깅하는 것, 트랜잭션 등 변경사항에 대한 로그를 남기는 것
</aside>
✅ 트랜잭션 상태
Active : 트랜잭션이 현재 실행 중인 상태
Failed : 트랜잭이 실행되다 오류가 발생해서 중단된 상태
Aborted : 트랜잭션이 비정상 종료되어 Rollback 이 수행된 상태
Partially Committed : 트랜잭션의 연산이 마지막까지 실행되고 Commit이 되기 직전 상태
Committed : 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태
✅ 무결성
:데이터의 정확성, 일관성, 유효성을 유지하는 것
무결성이 유지되어야 데이터베이스에 저장된 데이터 값과 그 값에 해당하는 현실 세계의 실제 값이 일치하는지에 대한 신뢰가 생긴다.
💡데이터 무결성 제약조건의 종류
1. 개체 무결성(Entity integrity)
기본 키 제약이라고도 하며, 테이블은 기본키를 지정하고 그에 따른 무결성 원칙을 지켜야 하는 조건
- 기본 키(Primary Key)에는 Null 값이 올 수 없음
- 기본 키는 테이블 내에 오직 하나의 값만 존재해야 함(하나의 테이블 내에 동일한 기본 키를 가진 레코드는 존재할 수 없음)
기본 키란?
테이블에서 특정 레코드를 구별하기 위해 후보 키 중에서 선택된 고유한 식별자 키
2. 참조 무결성(Referential integrity)
외래 키 제약이라고도 하며, 테이블 간의 참조 관계를 선언하는 제약조건
- 외래 키(Foreign Key)의 값은 Null이거나 참조 릴레이션의 기본키 값과 동일해야 함
- 외래 키 속성은 참조할 수 없는 값을 지닐 수 없음(즉, 외래 키 속성 값이 상위 테이블의 인스턴스에 반드시 존재하거나 Null이어야 함)
외래키란?
한 테이블의 키 중에서 다른 테이블의 레코드를 유일하게 식별할 수 있는 키
3. 도메인 무결성(Domain integrity)
테이블에 존재하는 필드의 무결성을 보장하기 위한 것으로 필드의 타입, Null 값 허용 등에 대한 사항을 정의하고 올바른 데이터가 입력되었는지 확인하는 조건
예를 들어 주민등록번호 필드에 문자가 입력되는 경우엔 도메인의 무결성이 깨졌다고 볼 수 있음
4. Null무결성(Null integrity)
테이블의 특정 속성 값이 Null이 될 수 없게 하는 조건
5. 고유 무결성 (Unique integrity)
테이블의 특정 속성에 대해 각 레코드들이 갖는 값들이 서로 달라야 하는 조건
6. 키 무결성 (Key integrity)
하나의 테이블에는 적어도 하나의 키가 존재해야 하는 조건
7. 관계 무결성 (Relationship integrity)
테이블의 어느 한 레코드의 삽입 가능 여부 또는 한 테이블과 다른 테이블의 레코드들 사이의 관계에 대한 적절성 여부를 지정한 조건
💡무결성 제약조건의 장단점
장점
스키마를 정의할 때 일관성 조건을 오직 한 번만 명시하고, 데이터베이스가 갱신될 때 DBMS가 자동적으로 일관성 조건을 검사하므로 응용 프로그램들은 일관성 조건을 검사할 필요가 없음
단점
프로그래밍 작업이 훨씬 복잡해지고, 무결성 제약조건을 반복해서 구현해야 하고, 무결성 제약조건들 간에 서로 충돌이 발생할 수 있음