-
트랜잭션💻 computer science/📦 database 2022. 10. 5. 01:46
🤔 트랜잭션
💡 트랜잭션
- 데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위
- 데이터베이스에 접근하는 방법은 쿼리, 즉 여러 개의 쿼리들을 하나로 묶는 단위ACID 특징
1. 원자성 (Atomicity)
“all or nothing”
원자성(atomicity)은 트랜잭션이 이루어지는 작업(관련된 일)이 모두 수행되었거나 되지 않았거나를 보장하는 특징
트랜잭션 단위로 여러 로직들을 묶을 때 외부 API를 호출하는 것이 있으면 안된다!!!
왜❓
- 트랜잭션이 update, insert, 외부 API 호출로 이루어진 상황에서, 외부 API 호출이 실패하여 롤백을 한다면 내부적인 롤백에는 문제가 없다.
- 하지만, 만약 외부 API 호출을 완료하고 나서 롤백을 한다면, 외부 API로 반영된 내용은 롤백하기가 어렵다
- 따라서, 만약 외부 API를 호출하는 것이 있다면 롤백 처리에 주의해야 한다.
- 롤백이 일어났을 때 어떻게 해야 할 것인지에 대한 해결 방법이 있어야하고 트랜잭션 전파 를 신경써서 관리해야 한다.
커밋(commit)
- 여러 쿼리가 성공적으로 처리되었다고 확정하는 명령어
- 트랜잭션 단위로 수행되며 변경된 내용이 모두 영구적으로 저장되는 것
롤백(rollback)
- 트랜잭션으로 처리한 하나의 묶음 과정을 일어나기 전으로 돌리는 일
트랜잭션 전파
> 여러 트랜잭션 관련 메서드의 호출을 하나의 트랜잭션에 묶이도록 하는 것.
Spring 프레임워크
- @Transactional 애너테이션을 통해 여러 쿼리 관련 코드들을 하나의 트랜잭션으로 처리한다.
@Service @Transactional(readOnly = true) public class MemberService { private final MemberRepository memberRepository; public MemberService(MemberRepository memberRepository) { this.memberRepository = memberRepository; } }
2. 일관성 (Consistency)
‘허용된 방식’으로만 데이터를 변경해야 한다.
트랜잭션 시작 전, 후 상태가 일관성이 있다.
- 여러가지 조건, 제약, 규칙에 따라 유효함을 가져야 한다.
3. 격리성 (Isolation)
트랜잭션 수행중 다른 트랜잭션이 서로 끼어들지 못한다(방해 ❌, 독립적이다)
- 서로 격리되어 마치 순차적으로 실행되는 것처럼 작동되어야 하고, 데이터베이스는 여러 사용자가 같은 데이터에 접근할 수 있어야 한다.
그냥 순차적으로 하면??
- 성능이 나빠진다.
- 격리성은 여러 개의 격리 수준으로 나뉘어 격리성을 보장한다. (고립 단계)
트랜잭션 고립 단계 (격리 수준)
동시에 트랜잭션이 DB에 접근할 때 어떻게 하는지에 따라 단계로 구분
아래로 갈 수록 동시성이 강해지지만 격리성은 약해진다.
1️⃣ SERALIZABLE
말 그대로 트랜잭션을 순차적으로 진행시키는 것
여러 트랜잭션이 동시에 같은 행에 접근할 수 없다.
매우 엄격한 수준
- 교착 상태(deadlock)가 일어날 확률도 많고 가장 성능이 떨어지는 격리 수준.
2️⃣ REPEATBLE_READ
하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 막아준다.
새로운 행을 추가하는 것은 막지 않는다.
- 따라서, 이후에 추가된 행이 발견될 수 있다.
- phantom read 발생
3️⃣ READ_COMMITTED
가장 많이 사용되는 격리 수준
MySQL, PostgreSQL, 오라클 에서 기본값으로 설정
다른 트랜잭션이 커밋하지 않은 정보는 읽을 수 없다.
- 즉, 커밋 완료된 데이터에 대해서만 조회를 허용
- phantom read + non-repeatable read 발생
4️⃣ READ_UNCOMMITTED
가장 낮은 격리 수준
하나의 트랜잭션이 커밋되기 이전에 다른 트랜잭션에 노출되는 문제가 있지만 가장 빠르다.
- 몇몇 행이 제대로 조회되지 않더라도 괜찮은 거대한 양의 데이터를 ‘어림잡아’ 집계하는데 사용하면 좋다.
- phantom read + non-repeatable read + dirty read 발생
격리 수준에 따라 발생하는 현상
Phantom read
- 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 경우
- 사용자 A가 조회 → B가 다른 데이터 삽입 → 다른 결과가 조회
non-repeatable read
- 한 트랜잭션 내의 같은 행에 두 번 이상 조회가 발생했는데, 그 값이 다른 경우
- A가 조회 → B가 데이터 업데이트 → A가 다른 값을 조회
❗ phantom read 와 non-repeatable read 의 다른점
- non-repeatable read 은 행 값이 달라질 수 있는데
- phantom read 은 다른 행이 선택될 수 있다는 점이 다르다.dirty read
- non-repeatable read 와 유사
- 한 트랜잭션이 실행 중일 때 다른 트랜잭션에 의해 수정되었지만 아직 ‘커밋되지 않은’ 행의 데이터를 읽을 수 있을 때 발생
- A가 데이터를 업데이트한 내용이 커밋되지 않은 상태 → B가 조회시 업데이트 된 내용이 조회된다.
4. 지속성 (Durability)
성공적으로 수행된 트랜잭션은 영원히 반영되어야 한다.
→ 이는 데이터베이스에 시스템 장애가 발생해도 원래 상태로 복구하는 회복 기능이 있어야 함을 뜻한다.
- 체크섬
- 저널링
- 롤백
등의 기능을 제공
무결성
❓ 무결성
- 데이터의 정확성, 일관성, 유효성을 유지하는 것.
무결성이 유지되어야 데이터베이스에 저장된 데이터 값과
그 값에 해당하는 현실 세계의 실제 값이 일치하는지에 대한 신뢰가 생긴다.
종류
이름 설명 개체 무결성 기본키로 선택된 필드는 빈 값을 허용하지 않는다. 참조 무결성 서로 참조 관계에 있는 두 테이블의 데이터는 항상 일관된 값을 유지해야 한다. 고유 무결성 특정 속성에 대해 고유한 값을 가지도록 조건이 주어진 경우 그 속성 값은 모두 고유한 값을 가진다. NULL 무결성 특정 속성 값에 NULL이 올 수 없다는 조건이 주어진 경우 그 속성 값은 NULL이 될 수 없다는 제약 조건 참고 자료
'💻 computer science > 📦 database' 카테고리의 다른 글
📂 MySQL - 트랜잭션 격리 수준 (0) 2024.05.11 인덱스 (0) 2022.10.05 SQL / NoSQL (1) 2022.10.05 정규화 (0) 2022.10.05 데이터베이스 기본 (1) 2022.10.05