1️⃣트랜잭션의 개념과 성질(ACID)
🚀트랜잭션이란?
- 단일한 논리적인 작업 단위
- 논리적인 이유로 여러 SQL문들을 단일 작업으로 묶어서 나눠질 수 없게 만든 것
- SQL문들 중에 일부만 성공해서 DB에 반영되는 일은 일어나지 않는다.
🚀ACID
Atomicity (원자성)
- 모두 성공하거나, 모두 실패하거나 (All Or Nothing)
- trancation은 논리적으로 쪼개질 수 없는 작업 단위이므로 SQL문들이 모두 성공해야 한다.
- 중간에 SQL문이 실패하면 지금까지의 작업을 모두 취소하여 아무 일도 없었던 것처럼 rollback 한다.
- 데이터 베이스 상태가 계속 일관적일 수 있도록 유지
Consistency (일관성)
- transaction은 DB 상태를 consistent 상태에서 또 다른 consistent 상태로 바꿔줘야 한다.
- DB에 정의된 rules을 transaction이 위반했다면 rollback 해야 한다.
- transaction이 DB에 정의된 rule을 위반했는지는 DBMS가 commit 전에 확인하고 알려준다.
Isolation (격리, 분리)
- 여러 transaction들이 동시에 실행될 때도 혼자 실행되는 것처럼 동작하게 만든다.
- DBMS는 여러 종류의 isolation level을 제공하고 개발자는 그 중 어떤 level로 transaction을 동작시킬지 설정할 수 있다.
Durability (영존성)
- commit된 transaction은 DB에 영구적으로 저장한다.
- DB 시스템에 문제가 생겨도 commit된 transaction은 DB에 남아 있다.
- '영구적으로 저장한다' => '비휘발성 메모리에 저장한다'
- 기본적으로 transaction의 durability는 DBMS가 보장한다.
2️⃣Commit과 Rollback의 동작 원리
🚀Commit
- 지금까지 작업한 내용을 DB에 영구적으로 저장한다.
- transaction을 종료한다.
🚀Rollback
- 지금까지 작업들을 모두 취소하고 transaction 이전 상태로 되돌린다.
- transaction을 종료한다.
3️⃣Auto Commit 설정과 트랜잭션 제어
🚀Auto Commit
- 각각의 SQL문을 자동으로 transaction 처리 해주는 개념
- SQL문이 성공적으로 실행하면 자동으로 commit 한다.
- 실행 중에 문제가 있었다면 알아서 rollback한다.
- MySQL에서는 default로 autocommit이 enabled 되어 있다.
- 다른 DBMS에서도 대부분 같은 기능을 제공한다.
autocommit 상태 확인 쿼리
SELECT @@AUTOCOMMIT;
autocommit 비활성화 쿼리
SET autocommit = 0;
실행과 동시에 autocommit off하는 쿼리
START TRANSACTION;
Commit/Rollback과 함께 transaction이 종료되면 원래 autocommit 상태로 돌아간다.
🚀Transaction 사용 패턴
- 트랜잭션 시작
- 로직 수행
- 트랜잭션 커밋
- 문제 발생 시 트랜잭션 롤백
4️⃣트랜잭션 격리 수준
세 가지 이상 현상을 정의하고 어떤 현상을 혀용하는지에 따라서 각각의 isolation level(격리 수준)이 구분된다.
Isolation level | Dirty read | Non-repeatable read | Phantom read |
Read uncommitted | ⭕ | ⭕ | ⭕ |
Read committed | ❌ | ⭕ | ⭕ |
Repeatable read | ❌ | ❌ | ⭕ |
Serializable | ❌ | ❌ | ❌ |
🚀Dirty read : commit 되지 않은 변화를 읽음
트랜잭션2번이 y=20으로 롤백했기 때문에 x=80이라는 값도 유효하지 않은 값이 된다.
🚀Non-repeatable read : 같은 데이터의 값이 달라짐
트랜잭션1번은 같은 트랜잭션에서 데이터를 두번 읽었음에도 다른 값을 가져온다.
🚀Phantom read : 없던 데이터가 생김
같은 조건으로 두 번 읽었지만 다른 결과가 나온다. => 이상현상
개발자는 격리 수준을 통해 전체 처리량과 데이터 일관성 사이에서 어느 정도 거래를 할 수 있다.
5️⃣ 동시성 제어와 갱신 손실 문제
🚀동시성 제어(Concurrency Control)
- 여러 트랜잭션이 동시에 실행될 때, 데이터의 일관성을 유지하기 위해 제어하는 방식이다.
🚀갱신 손실 문제
- 여러 트랜잭션이 같은 데이터를 읽고, 수정 후 저장할 때 발생
- 마지막에 실행된 트랜잭션의 결과만 반영되고, 이전의 변경 내용이 사라지는 문제
6️⃣ DB 락과 데드락의 이해
🚀DB락
동시에 여러 트랜잭션이 접근할 때, 데이터의 정합성을 유지하기 위해 데이터베이스에서 제공하는 제어 메커니즘
🚀데드락
두 개 이상의 트랜잭션이 서로 가진 자원을 기다리며 영원히 진행되지 않는 상태
트랜잭션1과 트랜잭션2가 서로의 lock이 unlock 되기를 기다림
7️⃣ DB 회복(REDO, UNDO, 체크포인트 회복 기법)
데이터베이스 장애 발생 시 일관성을 유지하기 위해 수행하는 복구 기법
🚀REDO 회복 기법
- 트랜잭션이 커밋된 후 DB에 반영되지 않았다면 로그를 이용해 재실행
🚀UNDO 회복 기법
- 트랜잭션이 커밋되지 않고 중단되었을 때, 변경 사항을 원래 상태로 되돌리는 기법
- ROLLBACK 명령어 사용
🚀체크포인트 회복 기법
- 특정 시점에서 DB 상태를 저장하고, 장애 발생 시 해당 시점으로 복구
- 체크 포인트 이후의 로그만 사용하여 빠른 복구 가능
참고자료
https://www.youtube.com/watch?v=sLJ8ypeHGlM
https://www.youtube.com/watch?v=bLLarZTrebU&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=17
https://www.youtube.com/watch?v=0PScmeO3Fig&list=PLcXyemr8ZeoREWGhhZi5FZs6cvymjIBVe&index=18
'CS > 데이터베이스' 카테고리의 다른 글
[CS] 데이터 베이스_이상현상, 정규화 (3) | 2025.03.11 |
---|---|
[CS] 데이터베이스_인덱스 (0) | 2025.03.10 |
[CS] 데이터베이스_SQL (0) | 2025.03.02 |
[CS] 데이터베이스란? (0) | 2025.02.22 |