1. 트랜잭션이란 ?
트랜잭션(Transaction) 은
데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 혹은 한꺼번에 모두 수행되어야 할 데이터베이스의 연산들을 의미한다.
- 하나의 트랜잭션은
Commit
되거나 Rollback
된다.
- 따라서 데이터 베이스의 회복과 병행 제어가 가능하다.
- SQL문으로 표현된다
- 트랜잭션의 모든 명령문이 완벽하게 처리되거나 <-> 하나도 처리되지 않아야한다.
- 완벽하게 처리되면 커밋(commit)을 하고, 오류 발생 시 원래 상태대로 롤백(rollback)을 한다.(하나도 처리되지 않음)
- 트랜잭션은 데이터베이스의 데이터 부정합을 방지하고자 할 때 사용한다.
트랜잭션은 은행에서 송금하는 경우의 예시를 가장 많이 든다.
2. 트랜잭션의 성질(ACID)
데이터베이스의 트랜잭션이 안전하게 수행되기 위해서는 ACID 조건을 충족해야 한다.
1️⃣ 원자성 (Atomicity)
- All or Noting
- 트랜잭션의 연산들이 모두 완벽히 수행되던지, 오류가 있다면 하나도 실행되지 않아야 함.
- 100개의 명령어로 구성된 트랜잭션 중 1개라도 실패가 된다면 무조껀 실패로 간주하여 롤백 해야함.
- A에서 B로 돈을 이체할 때 A와 B 계좌의 돈의 총합이 같아야 함.
- 원자성 보장
- 이전에 커밋된 상태를 임시영역에 저장
- 현재 트랜잭션에서 오류 발생시 날려버리고 임시영역에 커밋되었던 상태로 롤백 -> 이 영역을
롤백 세그먼트
라고한다.
2️⃣ 일관성 (Consistency)
- 트랜잭션의 수행이 성공적으로 완료된 후에도 데이터베이스가 일관성 있는 상태를 유지해야 함.
- 트랜잭션 실행 전의 DB상태와 실행 후의 DB상태가 각각 일관성이 보장되는 서로 다른 상태여야 함 .
3️⃣ 고립성 (Isolation)
- 여러 트랜잭션 수행시 다른 트랜잭션의 연산 작업이 끼어들 수 없다.
- 현재 수행중인 트랜잭션이 완료(커밋)될 때까지 중간 연산 결과에 다른 트랜잭션이 접근할 수 없음.
- 트랜잭션은 서로 영향을 받지 않고 각각 독립적으로 수행
4️⃣ 지속성 (Durability)
- 트랜잭션의 성공적인 완료 후에는 데이터베이스에 영구적으로 작업 결과가 반영 되어야 함.
- 비 휘발성 메모리에 데이터가 저장됨.
- 커밋을 하면 현재 상태가 영원히 보장된다는 것을 의미.
- 부분 완료 시에는 작업을 취소 해야함.
3. 특징
💡 무정지성
서버장애가 발생해 데이터베이스를 재가동시 장애 직전 까지의 커밋 결과를 손실하지 않고 마치는 것이 가능
- 트랜잭션을 지원하지 않는 DB는 OS장애가 발생하거나, 프로세스가 비정상적으로 종료되면 DB가 손상될 수 있다.
오라클
과 같은 트랜잭션 대응 DB는 REDO
로그를 이용한 아키텍처로 무정지성을 보장함.
REDO 로그
: 커밋 시 캐시영역에 보관, 주기적으로 디스크에 기록 -> REDO 로그는 상대적으로 최신 커밋 정보를 가짐. DB 재기동시 REDO 로그의 내용을 데이터파일에 적용하므로써 충돌 복구 과정을 수행
💡 트랜잭션의 상태
- 활동 : 트랜잭션 실행중
- 실패 : 트랜잭션 실행에 오류가 발생해 중단됨
- 철회 : 트랜잭션이 비정상 종료되어 롤백 된 상태
- 부분 완료 : 트랜잭션의 마지막 연산까지 실행, 커밋 직전
- 완료 : 트랜잭션이 성공적으로 종료후 커밋 한 상태
4. 연산
💡 커밋(Commit)
- 모든 작업들을 정상적으로 처리했다고 확정하는 명령어
- 트랜잭션이 수행이 성공적으로 완료되었음을 선언하고 데이터베이스에 영구적으로 저장.
- 커밋하면 하나의 트랜잭션 과정이 종료되고 데이터가 업데이트 됨.
💡 롤백(Rollback)
- 작업 중 문제 발생 시 트랜잭션의 처리과정에서 발생한 변경사항을 취소하는 명령어
- 일부만 정상적으로 처리되도 모든 트랜잭션의 연산을 취소하고 이전의 상태로 되돌림.(마지막 커밋 시점)
- 롤백 시에는 해당 트랜잭션을 재 시작하거나 폐기.
세이브 포인트(Save Point)
임시 저장
, 부분 저장
-> 전체 취소가 아닌 특정부분을 취소할 때 사용
트랜잭션 분할 가능.
확실한 부분에 대해서는 롤백이 되지 않도록 중간 저장 지점을 지정할 수 있음.
5. 회복 (Recovery)
회복은 트랜잭션들을 수행하는 도중 장애 발생 시 데이터베이스가 손상되었을 때 손상되기 이전의 정상 상태로 복구하는 작업.
DBMS의 구성 요소인 Recovery Management 가 복구하는 역할을 담당.
💡 연기 갱신 기법(Deferred Update)
- 트랜잭션의 성공적으로 완료될 떄 까지 대이터베이스에 갱신을 연기하는 방법.
- 트랜잭션 중 갱신된 내용은 Log에 보관
- 트랜잭션 부분완료 시점에 Log보관 내용을 실제 데이터베이스에 기록
- 완료 전 롤백되면 따로 취소할 필요없이 무시하면 됨 (로그에 보관중이기 때문)
Redo
작업만 가능
💡 즉각 갱신 기법(Immediate Update)
- 트랜잭션이 데이터를 갱신하면 부분 완료 전이라도 즉시 데이터베이스에 반영
- 장애 발생시 회복 작업을 대비해 갱신된 내용들은 Log에 보관
- 회복 작업을 할때
Redo
와 Undo
사용 가능
💡 그림자 페이지 대체 기법(Shadow Paging)
- 갱신전 DB를 일정크기의 페이지 단위로 구성 -> 각 페이지마다 복사본(그림자 페이지)으로 별도 보관
- 실제 페이지에 트랜잭션으로 갱신 작업 시 장애 발생-> 롤백 시킬 때, 갱신된 이후의 실제 페이지 부분에 그림자 페이지를 대체하여 회복
Log
, Undo
, Redo
알고리즘이 필요없음.
💡 검사점 기법(Check Point)
- 특정 단계에서 재 실행이 가능하도록 갱신내용 등의 정보와 함께 검사점을 log에 보관, 장애 발생 시 트랜잭션 전체를 철회하지 않고 검사점 부터 회복 작업 진행 -> 회복 시간 절약
6. 트랜잭션 병행 제어 (Concurrency Control)
다수의 사용자가 데이터베이스에 요청을 보내면 병행처리 방식으로 진행.
효율이 높아지나, 동일한 자료를 동시에 접근해서 오류 발생 가능.
병행 처리의 문제점
종류 | 발생 상황 | 문제점 |
---|
갱신 유실 문제 | 두 트랜잭션이 동시에 동일한 자료를 갱신 | 첫째 갱신이 유실 |
오류 읽기 문제 | 갱신하는 도중에 다른 트랜잭션이 읽기 | 낡은 자료 읽기 |
잘못된 요약 | 두 자료를 갱신하는 도중에 읽기 | 요약 결과 오류 |
무결성 제약조건 | 두 자료의 제약조건을 검사하지 않고 갱신 | 일관성 위반 |
따라서 트랜잭션 병행 제어
가 필요하다.
💡 트랜잭션 병행 제어의 목적
- 데이터베이스 일관성 유지
- 트랜잭션의 충돌 방지, 고립성 강제화
- 데이터베이스 공유 최대화
- 시스템의 활용도 최대화
- 사용자에 대한 응답시간 최소화
💡 병행 제어 기법
-
락킹(Locking)
- 하나의 트랜잭션이 데이터를 액세스하는 동안 다른 트랜잭션은 그 데이터를 액세스할 수 없게 함.
- 트랙잭션은 액세스 전 Lock을 요청하고 액세스를 마치고 Lock을 해제
-
타임 스탬프 순서화(Time stamp Ordering)
- 트랜잭션 간의 순서를 미리 정하여 제어하는 방법
- 트랜잭션 하나의 실행이 완료되면 다른 트랜잭션을 시작하는 방식
- 직렬화 기법임.
-
낙관적 기법
- 읽기 전용 트랜잭션이 대부분일 때는 병행 제어를 하지 않아도 문제가 없음.
- 검증과 확인하는 과정이 필요
-
다중 버전 기법
- 타임 스탬프 기법을 이용하며 버전을 부여하여 관리하는 기법
참고 자료 (Reference)
https://brunch.co.kr/@skeks463/27
http://wiki.hash.kr/index.php/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98#cite_note-.ED.8A.B8.EB.9E.9C.EC.9E.AD.EC.85.98_.EC.84.B1.EC.A7.882-1
https://velog.io/@guswns3371/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-ACID#acid
https://ehpub.co.kr/tag/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EB%B3%91%ED%96%89-%EC%A0%9C%EC%96%B4%EC%9D%98-%EB%AA%A9%EC%A0%81/
https://subsay.tistory.com/40