데이터베이스 5주차 스터디노트
DB 트랜잭션, 회복
DB 세션에 대해서 설명해주세요
Commit에 대해서 설명해주세요
- COMMIT 문은 트랜잭션의 종료를 알리는 SQL문
Rollback에 대해서 설명해주세요
- 트랜잭션을 전체 혹은 까지 무효화시킨다
SAVEPOINT란 수정내용을 반영하는 트랜잭션의 중간지점 포인트
Auto Commit 설정에 대해서 설명해주세요
- 쿼리 단위로 자동 커밋을 수행할지 여부를 나타낸다
트랜잭션에 대해 설명해주세요
트랜잭션의 성질 ACID에 대해서 설명해주세요
- 원자성(Atomicity): 트랜잭션에 포함된 작업은 전부 수행되거나 전부 수행되지 않아야한다
- 일관성(Consistency): 트랜잭션을 수행하기 전이나 수행한 후나 데이터베이스는 항상 일관된 상태를 유지해야한다.
- 고립성(Isolation): 수행 중인 트랜잭션에 다른 트랜잭션이 끼어들어 변경 중인 데이터 값을 훼손하는 일이 없어야 한다
- 지속성(Durability): 수행을 성공적으로 완료한 트랜잭션은 변경한 데이터를 영구히 저장해야한다.
트랜잭션 고립 수준 READ UNCOMMITED에 대해서 설명해주세요
- 고립수준이 가장 낮은 수준
- SELECT문: 공유락을 걸지 않음
- UPDATE문: 배타락 설정
- 다른 트랜잭션의 공유락과 배타락이 걸린 데이터를 읽음
- 오손(dirty)읽기 가능, 반복불가능 읽기 가능, 유령데이터 읽기 가능
트랜잭션 고립 수준 READ COMMITTED에 대해서 설명해주세요
- SELECT문: 공유락을 걸고 끝나면 바로 해지 (트랜잭션이 끝나기 전에도 해지가능)
- UPDATE문: 배타락 설정
- 다른 트랜잭션이 설정한 공유락은 읽지만 배타락은 읽지 못함
- 반복불가능 읽기 가능, 유령데이터 읽기 가능
트랜잭션 고립 수준 REPEATABLE READ에 대해서 설명해주세요
- SELECT문: 공유락을 걸고 트랜잭션 끝까지 유지
- UPDATE문: 배타락 설정
- 다른 트랜잭션이 설정한 공유락은 읽지만 배타락은 읽기 못함
- 유령데이터 읽기 가능
트랜잭션 고립 수준 SERIALIZABLE에 대해서 설명해주세요
- 고립수준이 가장 높은 명령어
- 실행 중인 트랜잭션은 다른 트랜잭션으로부터 완벽하게 분리
- SELECT문: 공유락을 걸고 트랜잭션 끝까지 유지
- UPDATE문: 배타락 설정
- 다른 트랜잭션이 설정한 공유락은 읽지만 배타락은 읽지 못함
- 인덱스에 공유락을 설정하여 다른 트랜잭션의 INSERT 문이 금지됨
DB 락에 대해서 설명해주세요
- 락은 트랜잭션이 데이터를 읽거나 수정할 때 데이터에 표시하는 잠금장치
DB 갱신 손실 문제에 대해서 설명해주세요
- 두 개의 트랜잭션이 한 개의 데이터를 동시에 갱신(update) 할 때 발생
DB 동시성 제어에 대해서 설명해주세요
- 트랜잭션이 동시에 수행될 때, 일관성을 해치지 않도록 트랜잭션의 데이터 접근을 제어하는 DBMS의 기능
DB 데드락에 대해서 설명해주세요
- 두 개 이상의 트랜잭션이 각각 자신의 데이터에 대하여 락을 획득하고 상대방 데이터에 대하여 락을 요청하면 무한 대기 상태에 빠지는 경우
DB 회복에 대해서 설명해주세요
- 회복은 데이터베이스에 장애가 발생했을 때 데이터를 일관성 있는 상태로 되돌리는 DBMS의 기능
REDO, UNDO 에 대해서 설명해주세요
- 시스템 운영 중 장애가 발생하여 시스템이 다시 가동되었을 때 DBMS는 로그 파일을 살펴봐서
트랜잭션이 종료되었는지 중단되었는지 여부를 판단하여 종료된 트랜잭션은 종료를 확정하기 위해 재실행(REDO)을 진행하고,
중단된 트랜잭션은 없던 일로 되돌리기 위해 취소(UNDO)를 진행한다
- 재실행(REDO): 로그파일에 트랜잭션의 시작(START)과 종료(COMMIT)이 있는 경우
- 취소(UNDO): 로그파일에 트랜잭션의 시작(START)만 있고 종료(COMMIT)가 없는 경우
체크포인트 회복 기법에 대해서 설명해주세요
- 회복시 많은 양의 로그를 검색하고 갱신하는 시간을 줄이기 위하여 몇 십 분 단위로 데이터베이스와 트랜잭션 로그 파일을 동기화한 후
동기화한 시점을 로그파일에 기록해두는 방법
MySQL InnoDB 의 기본 트랜잭션 고립 수준은 뭘까요?
추가학습
공유락(LS, shared lock)
배타락(LX, exclusive lock)
공유락 배타락 규칙
- 다른 트랜잭션이 LS를 걸어두면 LS의 요청은 허용하고 LX는 허용하지 않는다
- 다른 트랜잭션이 LX를 걸어두면 LS, LX 모두 허용하지 않는다
- 트랜잭션이 락을 허용받지 못하면 대기상태가 된다
- 다시말해 공유락은 상호허용이 되거나 배타락은 허용되지 않는다
오손읽기(dirty read)
- 읽기 작업을 하는 트랜잭션 1이 쓰기 작업을 하는 트랜잭션 2가 작업한 중간 데이터를 읽기 때문에 생기는 문제
작업 중인 트랜잭션 2가 어떤 이유로 작업을 철회(ROLLBACK)할 경우 트랜잭션1은 무효가 된 데이터를 읽게 되고 잘못된 결과를 도출
반복불가능 읽기(non-repeatable read)
- 트랜잭션 1이 데이터를 읽고 트랜잭션 2가 데이터를 쓰고 (갱신, UPDATE), 트랜잭션이 1이 다시 한 번 데이터를 읽을 때 생기는 문제
트랜잭션1이 읽기 작업을 다시 한번 반복할 경우 이전의 결과가 반복되지 않는 현상
유령데이터 읽기(phantom read)
- 트랜잭션1이 데이터를 읽고 트랜잭션 2가 데이터를 쓰고(삽입, INSERT), 트랜잭션 1이 다시 한번 데이터를 읽을 때 생기는 문제
트랜잭션이 읽기 작업을 다시 한번 반복할 경우 이전에 없던 데이터(유령데이터)가 나타나는 현상
트랜잭션 수행과정
- 트랜잭션이 시작하면 수행(active) 상태가 된다
- 정상적으로 수행되면
COMMIT문을 만나 부분완료된다
- 부분완료 후 버퍼의 내용을 데이터베이스에 기록하면 트랜잭션이 최종완료된다
로그파일
- 로그 파일은 트랜잭션이 반영한 모든 데이터의 변경사항을 데이터베이스에 기록하기 전에 미리 기록해두는 별도의 데이터베이스
- 수행 중에 변경된 데이터는 주기억장치의 버퍼에 기록된다
데이터 변경이 일어날 때마다 변경 내용은 로그파일에 저장된다
부분완료에 도달하면 변경된 데이터는 모두 로그파일에 기록된다