본문 바로가기
CS/데이터베이스

5주차. DB 트랜잭션, 회복

by wch_t 2023. 12. 4.

1. DB 세션에 대해서 설명해주세요.

*사용자 또는 응용 프로그램이 DB에 접속하고 상호 작용하기 위해 필요한 연결로,

  DB 접속을 시작으로 접속 종료까지의 전체 기간을 의미한다.

 

[특징]

1) 연결 유지

     - 세션이 확립되면, 일정 기간동안 DB에 대한 연결을 유지할 수 있다.

 

2) 트랜잭션 처리

     - 트랜잭션을 관리하고, DB 작업을 일관성 있게 처리한다.

 

3) 자원 할당 및 해제

     - DB 연결에 필요한 자원을 할당하고, 사용이 끝나면 이를 해제한다.

 

4) 보안 및 권한 권리

     - DB 접근하기 위한 보안 및 권한 정보를 관리한다.

 

 

 

2. Commit에 대해서 설명해주세요.

*트랜잭션 내에서의 변경사항을 DB에 영구적으로 적용하고, 트랜잭션을 종료하는 작업

 

[시기]

트랜잭션이 완료될 때 명시적으로 호출되는 명령으로

성공 시 DB에 모든 변경 사항이 적용되고,

실패 시 해당 트랜잭션에서 수행한 변경 사항은 롤백되어 이전 상태로 복구된다.

 

 

 

3. Rollback에 대해서 설명해주세요.

*트랜잭션이 실패했을 때, 해당 트랜잭션에서 수행한 모든 변경을 취소하고 이전 상태로 되돌리는 DB 작업

  이를 통해 DB는 언제나 일관된 상태로 유지할 수 있다.

 

[상황]

1) 트랜잭션 실패

2) Lock 충돌

3) 명시적인 롤백 명령

 

 

 

4. Auto Commit 설정에 대해서 설명해주세요.

*사용자가 Commit 명령을 따로 하지 않아도, 자동으로 각각의 SQL문을 Commit 하는 명령어

 

[세부개념]

- 각 SQL 문장이 실행될 때마다, 자동으로 커밋이 수행되어 DB에 즉시 변경 사항이 적용된다.

 - 명시적인 Commit 또는 Rollback 명령을 호출하지 않아도, 각 SQL 문장이 실행될 때마다 해당 문장이 포함된 트랜잭션이 자동으로 커밋된다.

 

[주의점]

- 각 SQL이 독립적인 트랜잭션으로 간주되어,

   하나의 문장이 실패하더라도 이전에 성공적으로 수행된 문장은 영향을 받지 않음

- 여러 SQL 문장을 하나의 트랜잭션으로 묶어야 하는 경우에는, Auto Commit을 비활성화하여 관리하는 것이 좋음.

 

 

 

5. 트랜잭션에 대해 설명해주세요.

*DB의 상태를 변환시키기 위해 수행되는 논리적(최소) 작업 단위로, 하나 이상의 DB 조작(조회, 삽입, 갱신, 삭제)으로 구성

 

 

 

6. 트랜잭션의 성질 ACID에 대해서 설명해주세요.

- 원자성 (Atomicity)

: 트랜잭션은 원자적인 단위로 간주된다.

  이것은 트랜잭션 내의 모든 데이터 조작이 성공적으로 완료되어 DB에 모두 반영되던가, 아니면 전혀 반영되지 않아야 한다.

  실패한 경우 데이터베이스는 이전 상태로 롤백되어야 한다.

 

ex. 계좌이체를 할 때  '송금'과 '입금'이 모두 성공적으로 완료되어야 하며,

      한 쪽이라도 수행이 되지 않을 시 이전(기존) 상태로 롤백되어야 한다.

 

 

- 일관성 (Consistency)

: 트랜잭션을 수행하면 데이터베이스는 일관된 상태로 유지되어야 한다.

  즉, 트랜잭션이 시작하기 전과 끝난 후의 데이터베이스 상태(제약)는 일관성이 있어야 한다.

 

ex. '모든 고객은 반드시 이름을 가져야 한다.' DB 제약에서

      이름 없는 새로운 고객을 추가하는 쿼리

      기존 고객의 이름을 삭제하는 쿼리

 

 

- 고립성 (Isolation)

: 동시에 여러 트랜잭션이 실행 중인 경우, 각 트랜잭션은 다른 트랜잭션의 작업에 영향을 미치지 않고 독립적으로 실행되는 것처럼 처리되어야 한다.

  이것은 다른 트랜잭션의 작업을 볼 수 없어야 함을 의미한다.

 

ex. 동시에 계좌 이체가 진행되는 경우

 

 

- 지속성 (Durability)

: 트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 데이터베이스에 저장되어야 한다.

  이것은 시스템 장애 또는 전원 손실과 같은 문제가 발생해도 데이터가 유실되지 않음을 의미한다.

 

ex. 계좌 이체 성공 후, 은행 DB에 기록이 남고 저장이 되는 경우

 

 

 

7. 트랜잭션 격리 수준이 뭘까요?

https://mangkyu.tistory.com/299

 

[MySQL] 트랜잭션의 격리 수준(Isolation Level)에 대해 쉽고 완벽하게 이해하기

이번에는 트랜잭션 격리 수준(Isolation Level)에 대해 알아보도록 하겠습니다. 아래의 내용은 RealMySQL과 MySQL 공식 문서 등을 참고하여 작성하였으며, 모든 내용은 InnoDB를 기준으로 설명합니다. 해당

mangkyu.tistory.com

 

*동시에 여러 트랜잭션이 실행될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 여부를 제어하는 DB 시스템 설정

 

- 트랜잭션 격리 수준이 낮은 순서대로 READ UNCOMMITED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE 가 존재

 

 

*공유 락(Shared Lock)

https://velog.io/@paki1019/%EA%B3%B5%EC%9C%A0-%EB%9D%BDShared-Lock%EA%B3%BC-%EB%B2%A0%ED%83%80-%EB%9D%BDExclusive-Lock

 

*넥스트 키 락 = 레코드 락 + 갭 락

https://mangkyu.tistory.com/298

 

 

 

8. 트랜잭션 격리 수준 READ UNCOMMITTIED에 대해서 설명해주세요.

- 미완료 읽기

- 커밋하지 않은 데이터조차도 접근할 수 있는 격리 수준이다.

- Dirty Read, Non-repeatable Read, Phantom Read와 같은 문제 발생 가능

 

*RDBMS 표준에서 인정하지 않을 정도로 정합성에 문제가 많은 격리 수준

 

트랜잭션이 완료되지 않았는데도, 다른 트랜잭션에서 볼 수 있는 부정합 문제인 Dirty Read 발생

 

 

9. 트랜잭션 격리 수준 READ COMMITTED에 대해서 설명해주세요.

- 완료 읽기

- 커밋된 데이터만 조회할 수 있다.

- Dirty Read 방지, Non-Repeatable Read, Phantom Read 발생 가능

 

Non-Repeatable Read(반복 읽기 불가능)

: READ COMMITTED에서 반복 읽기를 수행하면 다른 트랜잭션의 커밋 여부에 따라 조회 결과가 달라질 수 있다.

 

반복 읽기에서 발생하는 Non-Repeatable Read 문제

 

 

 

10. 트랜잭션 격리 수준 REPEATABLE READ에 대해서 설명해주세요.

- 변경 전의 레코드를 UNDO 공간에 백업

 

- 변경 전/후 데이터가 모두 존재하므로, 동일한 레코드에 대해 여러 버전의 데이터가 존재 (MVCC)

 

- 한 트랜잭션 내에서 동일한 결과를 보장하지만, 새로운 레코드가 추가되는 경우에 부정합이 생길 수도 있다.

 

- Non-repeatable Read 방지, Phantom Read 발생 가능

 

 

Phantom Read(유령 읽기)

: 트랜잭션이 끝나기 전에 다른 트랜잭션에 의해 추가된 레코드가 발견되는 경우

 

 

1) 잠금이 사용되지 않는 일반적인 경우

- MVCC로, 자신보다 나중에 실행된 트랜잭션이 추가한 레코드는 무시하면 된다.

 

2) 잠금이 사용되는 경우 (일반적인 RDBMS)

*SELECT ... FOR UPDATE : 배타적 잠금(비관적 잠금, 쓰기 잠금) 

 

갭락이 존재하지 않으므로, 사용자 A의 요청은 잠금 없이 즉시 실행된다.

이 때, 사용자 B가 SELECT ... FOR UPDATE 로 다시 한 번 데이터를 조회하면, 2건의 데이터가 조회된다.

 

일반적인 RDBMS에서의 '쓰기 잠금' 쿼리로 인한 Phantom Read 발생 O

 

 

 

3) MySQL에서의 갭 락

 

     3-1)

     - MySQL에서는 갭 락이 존재(트랜잭션이 종료될 때까지 대기)하기 때문에 일반적으로 Phantom Read가 발생하지 않는다.

        (쓰기 잠금할 때 갭 락 설정)

 

MySQL에서의 '쓰기 잠금' 쿼리를 사용할 때 갭 락으로 인한 Phantom Read 발생 X

 

 

 

     3-2) Phantom Read가 발생하는 유일한 케이스

 

     사용자 B : 잠금없는 SELECT 문으로 데이터 조회

     사용자 A : INSERT 문을 사용해 데이터 추가

                      잠금이 없으므로 바로 COMMIT

     사용자 B : SELECT FOR UPDATE 조회

                     UNDO 로그가 아닌 테이블로부터 레코드를 조회하므로 팬텀 리드 O

 

UNDO 로그가 아닌 테이블로부터 레코드를 조회하므로 Phantom Read 발생 O

 

 

 

11. 트랜잭션 격리 수준 SERIALIZABLE에 대해서 설명해주세요.

- 가장 엄격한 격리 수준으로, 이름 그대로 트랜잭션을 순차적으로 진행시킨다.

 

- 여러 트랜잭션이 동일한 레코드에 동시 접근할 수 없으므로, 어떠한 데이터 부정합 문제도 발생하지 않는다.

   하지만 트랜잭션이 순차적으로 처리되어야 하므로 동시 처리 성능이 매우 떨어진다.

 

- 순수한 SELECT 작업은 아무런 레코드 잠금 없이 동작하지만

   SERIALIZABLE 격리 수준에서는 순수한 SELECT 작업에서도 대상 레코드에 넥스트 키 락을 읽기 잠금(공유락, Shared Lock)을 건다.    (MySQL에서, "SELECT FOR SHARE/UPDATE"는 "대상 레코드에 각각 읽기/쓰기 잠금"을 거는 것)

 

 

 

12. DB 동시성 제어에 대해서 설명해주세요.

*여러 사용자 또는 트랜잭션이 동시에 DB에 액세스할 때 발생할 수 있는 문제를 관리하고 제어하는 기술

 

1) Lock

- 가장 일반적인 방법

- 트랜잭션이 데이터를 읽거나 쓸 때, 해당 데이터에 lock을 걸어 다른 트랜잭션이 접근하지 못하도록 한다.

- DeadLock 등의 발생 가능

 

2) Isolation Level

- DB에서 제공하는 트랜잭션 격리 수준을 조절하여 동시성을 제어

 

3) MVCC (Multi-Version Concurrency Control)

- 여러 버전의 데이터를 유지하여, 동시에 여러 트랜잭션이 동작할 수 있도록 한다.

 

4) Optimistic Concurrency Control

- 트랜잭션이 커밋되기 전에 충돌 여부를 확인하지 않고, 커밋 시에 충돌이 발생한 경우 롤백하고 다시 시작하는 방식

 

5) Flags

- 특정 데이터에 대한 동시 액세스를 제어하기 위해 플래그 사용

   - ex. "in-use" flag 설정하여, 해당 데이터에 대한 동시 액세스를 막을 수 있다.

 

 

 

13. 갱신 손실 문제에 대해 설명해주세요.

*2개 이상의 트랜잭션이 동시에 같은 데이터를 수정하고, 그 결과가 충돌해서 한 트랜잭션이 다른 트랜잭션의 변경 사항을 덮어쓰는 경우

 

 

- 트랜잭션 도중 발생하는 문제로, 데이터의 일관성을 해칠 수 있다.

 

- 이러한 상황을 방지하기 위해, 동시성 제어 기법을 사용해야 한다.

   (Lock, Isolation Level, MVCC..)

 

 

14. DB 락에 대해서 설명해주세요.

*여러 트랜잭션이 동시에 데이터에 접근하는 것을 제어하기 위한 매커니즘

 

 

- 데이터 일관성, 동시성을 유지하기 위해 사용

 

[주요 종류]

1) Shared Lock

- 여러 트랜잭션이 같은 데이터를 동시에 읽을 수 있도록 하는 Lock

- 읽기 연산 동시에 수행

- 쓰기 연산을 수행하는 트랜잭션은, 다른 트랜잭션이 공유 Lock을 획득하는 동안 기다린다.(?)

 

2) Exclusive Lock, Write Lock

- 특정 데이터에 대한 읽기 및 쓰기 연산을 제한하며, 트랜잭션이 데이터를 수정할 때 사용

- 특정 트랜잭션이 배타적 락을 획득하면, 다른 트랜잭션은 해당 데이터에 대한 공유 락 또는 배타적 락을 얻을 수 없다.

 

3) Shared/Exclusive Lock

- 공유 락과 배타적 락을 동시에 사용할 수 있는 공유/배타적 락을 지원

 

 

[주의사항]

1) DeadLock 발생하지 않도록 주의

2) 최소한의 락을 사용하여 필요한 동시성을 유지

3) 트랜잭션 격리 수준과 함께 사용

 

 

 

15. DB 데드락에 대해서 설명해주세요.

*DB에서 둘 이상의 프로세스가 다른 프로세스가 점유하고 있는 자원을 서로 기다리면서, 무한 대기에 빠지는 상황

 

 

1) 상호 배제 (Mutual Exclusion)

- 자원은 한 번에 하나의 프로세스(트랜잭션)에 의해서만 사용될 수 있다.

→ Lock이나 Semaphore를 통해 구현

 

2) 보유 및 대기 (Hold and Wait)

- 프로세스(트랜잭션)가 이미 어떤 자원을 소유한 상태에서 다른 자원을 얻기 위해 대기하는 상태이어야 한다.

 

3) 비선점 (No Preemption)

- 다른 트랜잭션이 이미 소유한 자원을 강제로 빼앗아 사용할 수 없다.

 

4) 순환 대기 (Circular Wait)

- 트랜잭션들이 원형으로 자원을 대기하는 상태이어야 한다.

 

 

 

16. DB 회복에 대해서 설명해주세요.

*시스템이나 DB의 장애로부터 복구하는 과정

 

 

1) 로그 (Log)

- DB에서 발생하는 각각의 트랜잭션에 대한 기록을 의미

- 트랜잭션이 시작되고 커밋되는 과정 등이 로그에 기록되어야 한다.

- 회복 시에 변경 내역을 추적하고, 데이터를 일관된 상태로 회복하는데 사용된다.

 

2) 체크포인트 (Checkpoint)

- 주기적으로 DB 상태를 저장하는 지점

- DB의 일관성을 유지하고, 회복 작업의 범위를 제한할 수 있다.

 

3) 회복 관리자 (Recovery Manager)

- DB의 회복 작업을 관리하는 시스템 구성 요소

- 로그를 기반으로 DB의 손상된 부분을 식별하고, 필요한 회복 작업을 수행

 

4) 회복 기법

     - 롤백

          - 로그를 사용하여 지원

 

     - 재수행 (Redo)

          - 커밋된 트랜잭션의 변경 내역을, 로그를 기반으로 다시 적용하여 DB를 회복하는 방법

 

     - 그림자 페이지 (Shadow Paging)

          - DB 사본을 유지하고, 변경 사항을 로그에 기록하여 회복하는 방법

 

5) 데이터베이스 미디어 복구 (Media Recovery)

- DB 물리적인 파일이 손상된 경우, 백업된 DB 사본을 사용하여 회복하는 과정

 

 

 

17. REDO, UNDO에 대해서 설명해주세요.

1)  REDO (Recovery)

- 트랜잭션이 커밋이 되었지만 DB가 시스템 장애로 인해 손상된 경우에 사용되는 개념

- 변경 사항을 로그에 기록하고, 이를 사용하여 트랜잭션이 재수행될 때 변경 사항을 다시 적용하여 DB 복구

 

- 시스템 장애로 인한 DB 손상 시에 복구를 위해 사용

- 변경 사항을 로그에 기록하고 트랜잭션이 재수행될 때 이전 상태로 다시 적용

  (현재 트랜잭션이 실행되기 전, 이전 트랜잭션과의 일관성을 확인하는 건가..?)

 

 

2) UNDO (Rollback)

- 트랜잭션이 롤백되는 경우에 사용되는 개념

- 트랜잭션이 시작되고 커밋되기 전까지의 변경 사항을 취소하고, DB를 이전 상태로 되돌리는 작업

 

- 롤백 시에만 사용

- 트랜잭션이 시작되고 커밋되기 전까지의 변경 사항을 기록한다.

 

(음.. 프로젝트를 닫기(커밋) 전까지 ctrl z가 가능한 느낌인건가?)

 

 

 

18. 체크포인트 회복 기법에 대해서 설명해주세요.

*DB 시스템에서 발생한 장애로부터 회복 시간을 최소화하는 방법 중 하나

 

 

- 주기적으로 체크포인트를 설정하여 DB 상태를 안정적인 지점으로 기록하고, 이를 이용하여 장애 발생 시 빠르게 회복하는 방법 제공

 

 

 

19. MySQL InnoDB의 기본 트랜잭션 고립 수준은 뭘까요?

*기본적으로 InnoDB는 "REPEATABLE READ"라는 트랜잭션 고립 수준을 사용한다.

 

 

- ACID 특성을 유지하면서도 동시성을 지원하는데 중점을 둔 격리 수준이다.