5주차 - 트랜잭션, 회복
1. DB 세션에 대해서 설명해주세요.
네트워크에서 세션(Session)은 두 엔드포인트 간의 (논리적) 양방향 연결 상태를 말합니다. 웹 서버의 세션은 클라이언트-서버 연결 상태를 위해 사용자의 인증 정보를 서버가 관리하는 방식을 말합니다. DB의 세션은 클라이언트-DB 양방향 연결 상태를 말합니다. 세션의 생명주기는 연결의 시작(DB 접속)부터 작업 수행 후 연결 종료(DB 접속 종료)까지입니다.
커넥션?
커넥션(Connection)은 TCP 소켓을 통한 DB와 클라이언트 간의 물리적 연결입니다. 커넥션을 통한 모든 요청은 세션을 통해서 실행됩니다. 한 커넥션에 여러 개의 세션을 가질 수 있습니다. 사용자가 커넥션을 닫으면 세션은 종료됩니다.
모범 예상 답변
2. Commit에 대해서 설명해주세요.
커밋(Commit)은 내가 작성한 쿼리문과 데이터를 최종적으로 DB에 영구 저장하는 것입니다. 커밋을 수행하는 건 하나의 트랜잭션을 종료하는 것입니다. 커밋을 수행하면 이전 데이터가 완전히 업데이트 됩니다.
모범 예상 답변
3. Rollback에 대해서 설명해주세요.
롤백(Rollback)은 작업 중 문제가 발생해서 트랜잭션의 처리 과정에서 발생한 변경 사항을 취소하는 것입니다. 롤백은 트랜잭션이 시작되기 이전의 상태(=마지막 커밋 완료 시점)로 되돌립니다.
모범 예상 답변
4. Auto Commit 설정에 대해서 설명해주세요.
오토 커밋(Auto Commit)은 쿼리를 자동으로 COMMIT하는 명령어입니다. 전체 트랜잭션 과정 중 일부가 오토 커밋 처리가 되어있다면 트랜잭션이 롤백되더라도 오토커밋된 쿼리는 복구되지 않습니다.
모범 예상 답변
5. 트랜잭션에 대해 설명해주세요.
트랜잭션(Transaction)은 DB에서 여러 단계로 처리되어야 할 명령문들을 묶어 하나로 처리하는 논리적 작업 단위입니다. 여러 개의 명령어 중 하나라도 잘못되면 전체가 취소됩니다. 명령어 집합이 전부 정상 처리되면 정상 종료됩니다. 트랜잭션을 사용하면 데이터의 일관성을 유지하면서 안정적으로 데이터를 복구할 수 있습니다.
모범 예상 답변
6. 트랜잭션의 성질 ACID에 대해서 설명해주세요.
ACID는 트랜잭션의 안정성을 보장하기 위해 필요한 조건을 말합니다.
A
A(Atomicity, 원자성)는 트랜잭션 내부의 명령어가 전부 성공하거나 전부 실패하는 것을 말합니다. 예를 들어 계좌이체를 할 때 두 단계가 있습니다.
A계좌에서 출금한다.
B계좌에 입금한다.
만일 1번은 성공하고 2번은 실패하면 원자성을 위반합니다.
C
C(Consistency, 일관성)는 트랜잭션 이전과 이후 DB의 상태가 이전과 같이 유효함을 말합니다. 유효하다는 건 DB의 제약이나 규칙을 만족한다는 것입니다. 예를 들어 '모든 고객은 반드시 이름이 있어야 한다'는 제약조건을 가지고 있습니다.
이름 없는 고객을 추가하는 쿼리
기존 고객의 이름을 삭제하는 쿼리
위 트랜잭션은 일관성을 위반합니다.
I
I(Isolation, 격리성)는 모든 트랜잭션이 다른 트랜잭션으로부터 독립되는 것을 말합니다. 동시에 여러 트랜잭션이 수행될 때 각 트랜잭션은 고립되어 있어 연속으로 실행한 것과 동일한 결과를 반환합니다. 예를 들어 계좌에 10,000이 있습니다.
계좌 B로 5천원 이체
계좌 C로 5천원 이체
1번과 2번 트랜잭션을 동시에 수행해도 B에 송금한 뒤 C에 보내는 결과와 동일해야 합니다. 만일 연속으로 실행한 결과와 다른 경우 격리성을 위반합니다.
D
D(Durability, 지속성)는 하나의 트랜잭션이 성공적으로 수행되었을 대 해당 트랜잭션의 로그가 남는 성질을 말합니다. 만일 런타임 오류나 시스템 오류가 발생해도 해당 기록은 영구적이어야합니다. 예를 들어 은행에서 계좌이체를 성공적으로 실행한 뒤 은행 DB에 오류가 발생했습니다. 이 때 계좌이체 내역은 기록으로 남아야 합니다. 만일 계좌이체 내역을 로그로 기록하기 전 종료가 되면 해당 트랜잭션은 실패하며 롤백이 실행되어야 합니다.
모범 예상 답변
7. 트랜잭션 격리 수준이 뭘까요?
격리 수준(isolation level)은 트랜잭션 간의 고립 정도를 나타내는 지표입니다. 격리 수준에 따라 다른 트랜잭션이 처리하는 데이터에 대한 접근 권한이 달라집니다. 레벨이 높을 수록 고립 정도가 높고 성능 저하가 일어날 수 있습니다. 격리 수준은 트랜잭션의 ACID를 보장하기 위해 사용합니다.
Dirty Read
Dirty Read란 트랜잭션 작업이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있는 현상을 말합니다.
Non Repeatable Read
Non Repeatable Read는 한 트랜잭션 내에서 하나의 레코드 값이 다르게 조회될 수 있는 현상을 말합니다.
Phantom Read
Phantom Read는 하나의 트랜잭션 내에서 조회 쿼리 결과 레코드의 수가 달라지는 현상을 말합니다.
모범 예상 답변
8. 트랜잭션 격리 수준 READ UNCOMMITTIED에 대해서 설명해주세요.
READ UNCOMMITTED는 각 트랜잭션의 커밋하지 않은 데이터도 접근할 수 있습니다. 이 수준은 Dirty Read, Non Repeatable Read, Phantom Read가 발생합니다.
모범 예상 답변
9. 트랜잭션 격리 수준 READ COMMITTED에 대해서 설명해주세요.
READ COMMITTED는 커밋이 완료된 데이터만 접근할 수 있습니다. 다른 트랜잭션이 UPDATE 쿼리를 커밋하는 경우 Non Repeatable Read가 발생합니다. 다른 트랜잭션이 INSERT 쿼리를 커밋하는 경우 Phantom Read가 발생합니다. RDBMS에서 대부분 기본적으로 사용하는 격리 수준입니다.
모범 예상 답변
10. 트랜잭션 격리 수준 REPEATABLE READ에 대해서 설명해주세요.
REPEATABLE READ는 자신의 트랜잭션이 생성되기 이전 트랜잭션에서 COMMIT된 데이터만 읽습니다. 일반적으로 내가 작업한 이후 커밋은 Undo 공간을 참고해서 동일한 결과를 반환합니다. 그러나 FOR UPDATE 실행 시에는 잠금이 걸려 Undo를 참고할 수 없어 Phantom Read가 발생합니다. MySQL과 MariaDB가 기본으로 사용합니다. MySQL은 트랜잭션마다 트랜잭션 ID를 부여해서 트랜잭션 ID보다 작은 트랜잭션 번호에서 변경한 것만 읽습니다.
모범 예상 답변
11. 트랜잭션 격리 수준 SERIALIZABLE에 대해서 설명해주세요.
SERIALIZABLE은 데이터에 접근할 때 항상 락을 걸고 데이터를 조회합니다. 엄격한 격리 수준을 자랑하지만 성능 문제로 필요한 경우가 아니면 사용하지 않습니다.
모범 예상 답변
12. DB 동시성 제어에 대해서 설명해주세요.
DB 동시성 제어(Concurrency Control)은 트랜잭션이 동시에 수행될 때 일관성을 해치지 않도록 트랜잭션의 데이터 접근을 제어하는 DBMS의 기능을 말합니다.
MV?
MV(Multi-Version, 다중 버전)는 동일한 레코드에 대한 여러 버전의 데이터를 말합니다. RDBMS는 데이터를 변경하고 커밋하지 않은 시점에 Undo 공간에 변경 전 데이터를 백업합니다. 변경 전/후 데이터가 모두 존재하므로 롤백이 일어나면 데이터를 복원할 수 잇습니다. 데이터가 불필요한 시점에는 백그라운드 스레드가 삭제합니다.
모범 예상 답변
13. 갱신 손실 문제에 대해 설명해주세요.
갱신 손실(Lost Update)은 두 개의 트랜잭션이 한 개의 데이터를 동시에 갱신할 때 발생하는 현상입니다.
모범 예상 답변
14. DB 락에 대해서 설명해주세요.
락(Lock)은 데이터를 수정 중이라는 사실을 알리는 잠금 장치를 말합니다. 락에는 읽기에 사용하는 공유락과 읽기/쓰기를 할 때 사용하는 배타락이 있습니다. 공유락이 설정된 데이터는 다른 트랜잭션도 공유락 요청이 가능하나 배타락은 접근할 수 없습니다. 배타락은 해당 트랜잭션이 완료될 때까지 유지됩니다.
모범 예상 답변
15. DB 데드락에 대해서 설명해주세요.
DB 데드락(Deadlock)은 두 개 이상의 트랜잭션이 각각 자신의 데이터에 락을 확득하고 상대방 데이터에 락을 요청해서 무한 대기에 빠지는 현상입니다. MySQL의 InnoDB는 데드락 감지 기능을 가지고 있어 2개의 트랜잭션 중 데이터 변화가 적은 것을 롤백시킵니다. 그러나 데드락 감시 기능은 속도 저하의 원인이 될 수 있습니다. 따라서 inoodb_lock_wait_timeout 설정으로 락을 건 후 특정 시간이 경과하면 자동으로 락을 해제시킬 수 있습니다.
모범 예상 답변
16. DB 회복에 대해서 설명해주세요.
DB 회복(recovery)은 장애가 발생했을 때 DB를 이전 상태로 복구시키는 것입니다. 이전 상태로 복구하기 위한 기본 원리는 중복(redundancy)으로 덤프나 로그 데이털르 이용합니다. 로그 데이터의 경우 별도의 파일에 기록하므로 이를 기반으로 DB를 회복합니다.
모범 예상 답변
17. REDO, UNDO에 대해서 설명해주세요.
REDO는 최근에 저장한 DB 복사본을 가져온 후 로그를 이용하여 모든 연산을 재싱행해서 복구하는 것입니다. UNDO는 예전 상태로 연산을 싹 다 취소해서 복구합니다.
모범 예상 답변
18. 체크포인트 회복 기법에 대해서 설명해주세요.
체크포인트 회복 기법은 로그 파일에 체크포인트를 기록하고 장애 발생 시 체크포인트 이전에 처리된 트랜잭션은 회복 작업에서 제외하고 이후에 처리된 내용에 대해서만 회복 작업을 수행하는 회복 기법입니다.
모범 예상 답변
19. MySQL InnoDB의 기본 트랜잭션 고립 수준은 뭘까요?
기본 트랜잭션 고립 수준은 REPEATABLE READ입니다. MySQL의 InnoDB는 next-key 잠금 알고리즘으로 Phantom Read를 방지합니다.
참고 자료
Last updated