트랜잭션이란?
데이터베이스에서 하나의 논리적 기능을 수행하기 위해 필요한 연산들을 묶는 단위
-> 필요한 연산들을 모두 완벽하게 처리(commit)하거나,
처리하지 못한 경우에는 원 상태로 복구(rollback)하여 작업의 일부만 적용되는 현상이 발생하지 않게 만들어주는 기능
커밋(Commit)이란?
- 모든 작업들을 성공적으로 처리되었다고 확정하는 명령어
=> 트랜잭션 내에 변경된 내용을 DB에 영구 저장하겠다는 의미이며, commit을 수행하면 하나의 트랜잭션이 성공적으로 종료된다. - Auto Commit: 사용자가 Commit 명령을 따로 하지 않아도, 모든 단건의 쿼리마다 자동으로 COMMIT이 실행되어 데이터베이스에 영구적으로 반영되도록 하는 명령
- 예를 들어 A가 B에게 송금하려면 아래와 같은 작업이 발생하는데, 2번 작업 이후 오류가 발생했다고 가정해보자.
- A의 계좌 잔액 조회 (잔액 select 조회 쿼리 호출)
- A의 계좌에서 돈 인출 (잔액 update 쿼리 호출)
- B의 계좌 잔액 조회 (잔액 select 조회 쿼리 호출)
- B의 계좌 잔액 업데이트 (잔액 update 쿼리 호출)
- SET AUTOCOMMIT = 1; 인 경우: auto commit이 활성화되어 있기 때문에, 오류 없이 완료된 쿼리문(1,2번)은 db에 반영된다.
-> A는 송금했지만, B는 받지 못하는 이슈 발생 - SET AUTOCOMMIT = 0; 인 경우: auto commit이 활성화되어 있지 않기 때문에, 트랜잭션이 일어나기 전 db 상황으로 rollback 된다.
-> A의 계좌에서 돈이 인출되기 이전의 상태로 되돌아감
- rollback: 트랜잭션 수행중 문제가 발생하면, 발생한 변경사항을 취소하여 트랜잭션 이전의 상태로 되돌리는 명령어
- 예를 들어 A가 B에게 송금하려면 아래와 같은 작업이 발생하는데, 2번 작업 이후 오류가 발생했다고 가정해보자.
트랜잭션 성질(ACID)
- 원자성(Atomicity): 하나의 트랜잭션에 포함된 모든 연산은 전부 정상적으로 수행되거나 전부 수행되지 않아야 함 (all or nothing)
- 일관성(consistency): 트랜잭션을 수행하기 전이나 수행한 후나 데이터베이스는 항상 일관된 상태를 유지해야 함
- unique, not null 등의 제약 또는 규칙이 트랜잭션 이전과 이후에 항상 지켜지게끔하여, 데이터의 일관성이 깨지는 걸 막음
- 격리성, 고립성(Isolation): 하나의 트랜잭션 수행 시 다른 트랜잭션이 끼어들지 못해야 함
- 동시에 수행되는 트랜잭션은 상호 존재를 모르고 독립적으로 수행되며, 이 때 DBMS는 동시성 제어를 통해 고립성을 유지함
- 동시성 제어: 동시에 수행되는 여러 트랜잭션이 같은 데이터를 동시에 읽고 쓸 경우, 충돌하지 않도록 제어하는 작업
- 지속성(Durability): 성공적으로 수행된 트랜잭션은 변경된 데이터를 영원히 저장해야 함
- 트랜잭션이 중간에 실패한다면, 트랜잭션이 수행한 작업을 원상복구하는 작업을 수행함
동시성 제어 기법
2개의 트랜잭션이 동시에 발생한다고 가정해보자. 이 때 발생할 수 있는 상황은 아래와 같다.
상황 | 트랜잭션1 | 트랜잭션2 | 발생 문제 | 동시접근 |
상황1 | 읽기 | 읽기 | 없음 | 허용 |
상황2 | 읽기 | 쓰기 | Dirty Read, Non-Repeatable Read, Phantom Read |
허용 또는 불가 선택 |
상황3 | 쓰기 | 쓰기 | 갱신손실 | 허용 불가 |
- 상황1: 두 트랜잭션 모두 읽기만 하기 때문에, 아무런 문제가 발생하지 않음
- 상황2: 트랜잭션 격리(고립) 수준에 따라 Dirty Read, Non-Repeatable Read, Phantom Read 문제가 발생함
- Dirty Read: 트랜잭션 처리 과정에서 아직 커밋되지 않은 데이터를 다른 트랜잭션에서 읽는 현상
- Non-Repeatable Read: 한 트랜잭션 내의 같은 행을 두 번 이상 조회했을 때, 읽어온 데이터가 다른 경우(데이터 수정으로 인해)
- Phantom Read: 한 트랜잭션 내에서 읽기 작업을 반복했을 때, 이전에 없던 데이터(유령 데이터)가 추가된 경우(데이터 삽입으로 인해)
- 상황3: 두 트랜잭션 모두 쓰기 작업을 수행하므로, 갱신손실 문제가 발생함
- 갱신손실(Lost Update)문제: 두 트랜잭션 작업을 동시에 수행할 때, 나중에 수행하는 트랜잭션이 이전 트랜잭션이 갱신한 내용을 덮어쓰기 함으로써 값 손실이 발생하고 갱신이 무효화되는 것을 의미
이렇게 데이터의 무결성을 해치는 문제점들을 해결하고, 동시에 실행되는 트랜잭션 수를 최대화하기 위해 DBMS는 다양한 동시성 제어기법을 제공한다.
종류
- 타임 스탬프(Time Stamp): 트랜잭션 시작되는 순서대로 타임 스탬프를 지정하여, 타임 스탬프를 동시성 제어의 기준으로 사용
- 트랜잭션 대기 시간은 없으나, Rollback 발생 확률이 높음
- 적합성 검증: 일단 검증 없이 트랜잭션을 동시에 수행후, 트랜잭션 종료 시 동시성 검증을 수행하여 데이터베이스에 반영 또는 철회
- 장기적으로 트랜잭션이 진행되었는데 Rollback 되는 경우 자원 낭비가 발생할 수 있음
- 락킹 기법(Locking Method)
- 공유락(Shared Lock): 읽기 잠금
- 트랜잭션1이 공유락을 걸어둔 경우 데이터를 읽기만 가능하며, 다른 트랜잭션 또한 읽기만 실행할 수 있다
- 다른 트랜잭션이 데이터 쓰기를 실행하고 싶으면, 트랜잭션1의 락이 풀릴 때까지 대기해야함
- 배타락(Exclusive Lock): 읽기 및 쓰기 잠금
- 트랜잭션1이 배타락을 걸어둔 경우 데이터를 읽고 쓸 수 있지만, 다른 트랜잭션은 읽기와 쓰기 모두 할 수 없으며 대기 상태가 된다
- 교착 상태(Dead Lock): 두 트랜잭션이 각각 락(Lock)을 획득하고 서로의 락에 접근하여 값을 얻어오려 할 때, 무한 대기 상태에 빠지는 현상
-> sql server는 데드락 발생시, 마지막에 실행된 트랜잭션을 강제로 중지(rollback) 시켜 데드락을 해결한다
- 공유락(Shared Lock): 읽기 잠금
- MVCC-다중 버전 동시성 제어(Multi Version Concurrency Control)
- 원본 데이터를 snapshot에 백업하여 undo log(MySQL 기준)에 보관함으로써, 변경중인 데이터와 원본 데이터를 동시에 유지
-> 하나의 레코드에 대해 여러 개의 버전이 동시에 관리됨 - 데이터 변경이 성공적으로 완료되면 디스크에 변경된 데이터를 반영하며, 변경이 취소된 경우에는 snapshot을 바탕으로 데이터를 복구한다
- 배타락을 사용하지 않으면서, 일관된 읽기를 제공하기 위한 목적
- 사용자 A가 트랜잭션 내에서 update문을 실행하고 commit을 하지 않았다면, 변경 전 데이터를 언두 로그로 복사한다.
그러면 사용자 B(다른 트랜잭션)는 select문 실행시 언두 로그에 있는 데이터를 읽어오게 된다. (Repeatable read 기준)
- 원본 데이터를 snapshot에 백업하여 undo log(MySQL 기준)에 보관함으로써, 변경중인 데이터와 원본 데이터를 동시에 유지
DB 회복이란?
데이터베이스 장애가 발생하면, 장애 발생 이전의 상태로 복구시켜 일관된 데이터베이스 상태를 만드는 것
회복 방법
- 덤프(Dump): 일정 주기로 원본 데이터베이스 전체 내용을 다른 저장장치에 복사하는 것
- 로그(Log): 변경 연산 발생시 마다 [트랜잭션ID, 데이터항목, 이전 값, 이후 값] 로그 생성하여 로그 파일에 저장하며,
회복시 로그 파일에 적힌 내용을 사용하여 복원- REDO: 트랜잭션 완료 후, 변경 내용이 디스크에 반영되지 않았을 수 있으므로, REDO 로그를 보면서 복구하여 데이터의 손실을 방지한다
- UNDO: 트랜잭션 내에서 데이터 변경 후 커밋하지 않았다면, UNDO 로그 파일을 통해 작업을 변경 이전 값으로 복구한다
체크 포인트 회복 방법
- 로그를 이용하여 DB 회복하려는 경우, 처음부터 마지막 로그 기록을 다 살펴보려면 시간이 오래 걸림
-> 이러한 문제점을 해결하기 위한 방법이 checkpoint - 회복 관리자가 일정한 시간 간격으로 검사 시점을 생성하여
장애 발생시 검사점 이전에 처리된 트랜잭션은 회복 작업에서 제외하고, 이후에 처리된 내용에 대해서만 회복 작업을 수행
- 체크포인트 이전에 트랜잭션이 완료된 경우: 아무런 작업 필요 X
- 체크포인트 이후에 Commit 기록이 있는 경우: REDO 필요
- 체크포인트 이후에 Commit 기록이 없는 경우: UNDO 필요
Reference
https://mangkyu.tistory.com/30
[Database] 8. 트랜잭션, 동시성 제어, 회복
[ 본 사진은 쉽게 배우는 오라클로 배우는 데이터베이스 개론과 실습 ppt에서 캡처했습니다. ]이번 장에서는 트랜잭션(Transaction), 동시성 제어(Locking or Currency Control), 회복(Recovery)에 대해 알아보겠
mangkyu.tistory.com
https://mangkyu.tistory.com/53
[Database] MVCC(다중 버전 동시성 제어)란?
오늘은 단일 쿼리로는 해결할 수 없는 로직을 처리할 때 필요한 개념인 트랜잭션에 대해 알아보고, Spring에서 어떻게 활용하는지 확인해보도록 하겠습니다. 1. 동시성 제어(Concurrency Control) [ 동시
mangkyu.tistory.com
'CS > DB' 카테고리의 다른 글
[DB] Connection & DB Session (0) | 2025.01.27 |
---|---|
[DB] 정규화 (0) | 2025.01.23 |
[DB] 인덱스 정의, 동작 방식, 종류 등 톺아보기(MySQL 기준) (0) | 2025.01.14 |
[DB] JOIN 알아보기 (0) | 2025.01.09 |
[DB] SQL 톺아보기 (0) | 2025.01.09 |