
본 게시글은 오라클로 배우는 데이터베이스 개론과 실습 2판 - 연습문제 8장 풀이입니다. 제가 이 책을 공부하면서 풀었던 풀이의 흔적이므로 정답이 아닐 수 있습니다. 혹여나 틀린 부분이 있어 오류를 댓글로 지적해주신다면 감사하겠습니다.
- 트랜잭션은 일련의 연산 집합이란 의미로, 하나의 논리적인 기능을 수행하는 작업의 단위다. 트랜잭션이 가져야할 성질로 거리가 먼 것은?
(1) 원자성 (Atomicity)
(2) 고립성 (Isolation)
(3) 지속성 (Durability)
(4) 병행성 (Concurrency) → 다수의 트랜잭션이나 프로세스가 시스템 자원을 공유하면서 동시에 실행되는 상태를 의미함
- 트랜잭션에 대한 설명으로 옳지 않은 것은?
(1) 한꺼번에 모두 수행되어야 할 일련의 데이터베이스 연산 집합이다.
(2) 데이터베이스의 일관성을 유지하는 프로그램 단위이다.
(3) 병행 제어 및 회복의 논리적인 작업 단위이다.
(4) 트랜잭션 연산이 데이터베이스에 모두 반영되지 않고 일부만 반영되는 것을 원자성이라고 한다. → 원자성은 트랜잭션 내의 모든 연산이 완전히 수행되거나 아예 수행되지 않아야 한다는 원칙을 의미함
- 트랜잭션의 성질에 대한 설명으로 옳지 않은 것은?
(1) 트랜잭션의 연산은 데이터베이스에 모두 반영되든지, 아니면 모두 반영되지 않아야 한다.
(2) 트랜잭션 수행이 성공적으로 완료되면 데이터베이스는 언제나 일관성 있는 상태를 유지해야 한다.
(3) 어느 하나의 트랜잭션 실행 중에 다른 트랜잭션이 동시에 실행될 수 없다. → 트랜잭션은 고립성 원칙에 따라 독립적으로 실행되지만, 다른 트랜잭션과 동시에 실행될 수 있음
(4) 트랜잭션에 의해서 생성된 결과는 데이터베이스에 영구히 저장되어야 한다.
- 트랜잭션의 동시성에 관한 설명 중 옳지 않은 것은?
(1) 락을 사용하면 갱신손실(lost update) 문제를 해결할 수 있다.
(2) 데드락(deadlock)이 발생하려면 반드시 트랜잭션과 데이터 아이템이 두 개 이상 관여해야 한다.
(3) 데이터에 공유락(LS)이 걸려 있다면 다른 트랜잭션의 공유락을 허용해도 된다.
(4) 2단계 락킹을 사용하면 데드락 현상은 발생하지 않는다. → 트랜잭션의 동시성을 관리해 데드락 발생 가는성을 줄일 수 있지만, 완전히 방지할 수는 없음
- 병행제어의 락킹(locking) 단위에 대한 설명으로 옳지 않은 것은?
(1) 락킹 단위가 작아지면 병행성 수준이 낮아진다. → 락킹 단위가 작아질수록 더 많은 트랜잭션이 동시에 실행될 수 있으므로, 병행성 수준은 실제로 높아짐
(2) 데이터베이스, 파일, 레코드 등은 락킹 단위가 될 수 있다.
(3) 락킹 단위가 작아지면 락킹 오버헤드가 증가한다.
(4) 한꺼번에 락킹할 수 있는 데이터의 크기를 락킹 단위라고 한다.
- 병행제어에 영향을 주는 요소로 한 번에 락(lock) 되어야 할 데이터의 크기를 락킹 단위(locking granularity)라고 한다. 이 단위가 클 경우에 대한 설명으로 옳지 않은 것은?
(1) 병행성 수준이 높아진다. → 락킹 단위가 클수록 더 많은 데이터가 락에 의해 보호되므로, 다른 트랜잭션이 해당 데이터에 접근하기 어렵게 되고, 병행성 수준은 오히려 낮아짐
(2) 병행 제어가 간단하다.
(3) 락의 수가 적어진다.
(4) 극단적인 경우 순차처리를 하는 것과 같다.
- 2단계 락킹에 대한 설명으로 옳지 않은 것은?
(1) 직렬성을 보장한다.
(2) 확장단계와 축소단계의 두 단계가 있다.
(3) 교착상태를 예방할 수 있다. → 2단계 락킹은 교착상태(데드락)를 예방하는 메커니즘이 아님. 오히려 특정 조건에서는 교착상태를 야기할 수도 있음
(4) 각 트랜잭션의 락 요청과 해제 요청을 2단계로 실시한다.
- 다음과 같이 동시성 제어 없이 두 트랜잭션 T1과 T2가 수행되는 경우 X의 최종값은? (단, X의 초기값은 100이다.)
T1 | T2 |
---|---|
Read_item(X) | |
X = X + 30 | |
Write_item(X) | |
Read_item(X) | |
Rollback | |
X = X - 50 | |
Write_item(X) |
(1) 30
(2) 50
(3) 80
(4) 100
- 하나의 데이터베이스 시스템 내에서 적절한 제어 없이 트랜잭션들을 동시에 실행하였을 경우 여러 문제가 발생할 수 있다. 이를 해결하기 위한 동시성 제어가 올바르게 동작하지 않을 경우 발생할 수 있는 문제점으로 옳지 않은 것은?
(1) 갱신손실 문제
(2) 부정확한 요약 문제
(3) 반복할 수 없는 읽기 문제
(4) 지역적 오류 문제
- 오라클의 기본 고립 수준은 무엇인가?
(1) SERIALIZABLE
(2) READ COMMITTED → 변경 중인 데이터에 대한 접근은 차단되어 일관된 데이터만 읽을 수 있으며, 다른 트랜잭션이 커밋하지 않은 데이터를 보는 것을 방지함
(3) READ UNCOMMITTED
(4) REPEATABLE READ
- 다음은 트랜잭션 고립 수준(isolation level) 설정을 위한 SQL 표준 형식이다. 이를 이용하여 설정할 수 있는 트랜잭션 고립 수준에 대한 설명으로 옳지 않은 것은?
SET TRANSACTRION {READ ONLY | READ WRITE}
ISONALTION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
(1) READ UNCOMMITTED로 설정된 트랜잭션은 완료되지 않은 트랜잭션이 생성한 데이터 값을 읽어가는 것을 허용하는 것이며, READ WRITE와 함께 설정될 수 없다.
(2) READ COMMITTED로 설정된 트랜잭션은 동일 조건의 데이터 집합을 반복하여 읽을 경우, 먼저 읽었던 데이터 집합에 있던 데이터 값과 새로이 읽은 데이터 집합에 있는 데이터 값이 달라져 있을 수 있다.
(3) REPEATABLE READ로 설정된 트랜잭션은 동일 조건의 데이터 집합을 반복하여 읽을 경우, 읽혀지는 집합을 구성하는 로우들의 수가 달라질 수 있다.
(4) SERIALIZABLE로 설정된 트랜잭션은 격리성을 완전하게 유지함으로써 트랜잭션의 일관성을 보존하고 동시에 수행중인 트랜잭션들의 처리율을 향상시킨다. → 높은 격리성 수준으로 인해 병행성이 감소하고, 트랜잭션 처리율이 떨어질 수 있음
- 회복을 위한 로그 기록 방법 중 지연갱신(deferred update)에서 사용하는 방법은 무엇인가?
(1) UNDO/REDO
(2) UNDO/NO-REDO
(3) NO-UNDO/REDO → 지연갱신 방법은 트랜잭션이 커밋되기 전까지는 실제 데이터베이스에 변경사항을 반영하지 않는 방식임. 이 방법에서는 트랜잭션이 성공적으로 커밋되기 전에 발생하는 실패에 대해서는 아무런 조치가 필요 없음(UNDO 작업이 필요 없음). 하지만, 커밋 후에 발생한 실패에 대해서는 커밋된 변경사항을 다시 반영해야 함(REDO 작업 필요).
(4) NO-UNDO/NO-REDO
- 지연갱신을 통한 점진적 로깅(incremental logging width deferred updates) 기법을 사용하는 복구 시스템으로 옳은 것은?
(1) 갱신된 데이터 아이템의 갱신 전 원래 값만을 로그에 저장한다.
(2) 갱신된 데이터 아이템의 갱신 후 수정된 값만을 로그에 저장한다. → 커밋 시에만 데이터베이스에 변경사항을 반영하므로, 갱신 후의 값만 로그에 기록하면 복구에 필요한 모든 정보를 가질 수 있음
(3) 갱신된 데이터 아이템의 갱신 전, 후 값을 모두 로그에 저장해야 한다.
(4) Begin Transaction과 Commit Transaction 레코드만을 로그에 저장하면 된다.
- 트랜잭션이 다음과 같이 동시에 수행될 때 결과를 구하시오. read_item()은 버퍼에 있는 데이터베이스를 읽는 함수이고, write_item()은 버퍼에 데이터베이스를 기록하는 함수이다. A1, A2는 트랜잭션 T1의 지역변수이고, B1, B2는 트랜잭션 T2의 지역변수이다. 트랜잭션이 시작하기 전의 데이터베이스에서 X와 Y의 값은 각각 1000이다.
[스케줄 1]
트랜잭션 T1 | 트랜잭션 T2 |
---|---|
A1 = read_item(X); | |
A1 = A1 + 100; | |
write_item(A1 → X); | |
B1 = read_item(Y); | |
B1 = B1 - 100; | |
write_item(B1 → Y); | |
A2 = read_item(X); | |
temp = A2 * 0.1; | |
A2 = A2 - temp; | |
write_item(A2 → X); | |
B2 = read_item(Y); | |
B2 = B2 + temp; | |
write_item(B2 → Y); |
[스케줄 2]
트랜잭션 T1 | 트랜잭션 T2 |
---|---|
A1 = read_item(X); | |
A1 = A1 + 100; | |
A2 = read_item(X); | |
temp = A2 * 0.1; | |
A2 = A2 - temp; | |
write_item(A2 → X); | |
B2 = read_item(Y); | |
write_item(A1 → X); | |
B1 = read_item(Y); | |
B1 = B1 - 100; | |
write_item(B1 → Y); | |
B2 = B2 _ temp; | |
write_item(B2 → Y); |
(1) [스케줄 1]과 같이 수행하였을 때, 수행 후 X와 Y의 값을 구하시오.
- X = 990
- Y = 1010
(2) [스케줄 2]와 같이 수행하였을 때, 수행 후 X와 Y의 값을 구하시오.
- X = 1100
- Y = 1100
(3) [스케줄 2]와 같이 트랜잭션이 동시에 수행되면 문제가 있는지 없는지 판단하시오. 그리고 그 이유를 설명하시오.
T2가 X에 대한 변경을 하고, T1이 이를 덮어쓰기 때문에 갱신 손실 문제가 발생함
(4) 이 문제를 해결하는 방법을 설명하시오. 이 경우 [스케줄 2]가 어떻게 진행되어야 하는지 설명하시오.
두 트랜잭션 간의 동시성을 제어해야 함. 한 트랜잭션이 데이터 항목을 사용하는 동안 다른 트랜잭션이 해당 항목을 사용하지 못하도록 해야 함
- 다음 트랜잭션 T1, T2가 동시에 실행될 때, 공유락과 배타락을 사용한다. 트랜잭션 T1의 첫 번째 질의의 수행되는 결과는 20이고, 두 번째 질의의 수행결과는 21이다.
트랜잭션 T1 | 트랜잭션 T2 |
---|---|
SELECT age | |
FROM Users | |
WHERE id = 1; | |
UPDATE Users | |
SET age = 21 | |
WHERE id = 1; |
COMMIT; |
| SELECT age
FROM Users
WHERE id = 1; | |
(1) 이러한 현상이 일어나는 이유와 현상의 이름을 설명하시오.
이 시나리오는 반복할 수 없는 읽기(Non-repeatable Read) 현상을 보여줌. 한 트랜잭션이 데이터를 읽은 후 같은 데이터를 다시 읽을 때 다른 트랜잭션에 의해 데이터가 변경되어서 처음 읽었던 값과 다른 값이 읽히는 현상임
(2) (1)의 현상을 방지하기 위한 방법을 설명하시오.
- 강력한 고립 수준을 사용해야 함. "Repeatable Read" 또는 "Serializable" 고립 수준을 사용하면 됨
- Repeatable Read 고립 수준에서는 한 트랜잭션이 읽은 데이터에 대해 다른 트랜잭션이 쓰기 락을 획득할 수 없음. 따라서, 한 트랜잭션이 데이터를 읽는 동안에는 다른 트랜잭션이 해당 데이터를 변경할 수 없음
(3) (1)의 현상을 방지하기 위한 SQL문을 작성하시오.
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
- 다음 트랜잭션 T1, T2가 동시에 실행될 때 결과에 대하여 다음 물음에 답하시오.
트랜잭션 T1 | 트랜잭션 T2 |
---|---|
SET TRANSACTION NAME ‘T1’; |
SELECT *
FROM Book;
SELECT SUM(price)
FROM Book; -- [1] | |
| | SET TRANSACTION NAME ‘T2’;
UPDATE Book
SET price = price + 100
WHERE bookid = 1;
COMMIT; -- [3] |
| SELECT SUM(price)
FROM Book; -- [2] | |
| | -- [4] |
(1) 두 트랜잭션을 수행하기 전 [1]번의 수행결과가 10000이라면, 두 트랜잭션을 위의 순서대로 실행했을 때 [2]번의 수행 결과는 무엇인가?
T2에 의한 변경 사항이 이미 커밋되었기 때문에, T1은 변경된 총합을 읽게 됨. 즉, 새로운 총합은 10,100임
(2) [1]번과 [2]번의 결과가 트랜잭션 T2의 영향을 받지 않으려면 어떻게 해야 하는가?
T1의 고립 수준을 "Repeatable Read" 또는 "Serializable"로 설정하면 됨. 이렇게 하면 T1이 첫 번째 SUM 쿼리를 실행할 때 설정된 스냅샷을 기반으로 두 번째 SUM 쿼리도 동일한 결과를 얻게 됨
(3) [3]번의 COMMIT 문을 [4]번으로 옮겨 다시 실행하면 어떻게 되는가?
T2의 UPDATE
연산이 T1의 두 번째 SELECT SUM(price)
쿼리 이후에 커밋됨. 이 경우, T1의 두 번째 SUM 쿼리는 T2의 UPDATE
연산에 영향을 받지 않으므로, 두 번째 SUM 쿼리의 결과도 10,000이 될 것임
(4) (3)과 같이 실행하면서 (1)의 실행 결과를 나타나게 하려면 어떻게 해야 하는가?
T1의 고립 수준을 "Read Committed"로 설정하면 됨
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
- 데드락은 대기 그래프(wait-for graph)를 그려 보면 발생 여부를 판단할 수 있다. 다음 표를 보고 대기 그래프를 그리고, 데드락의 발생 여부를 판단하시오.
트랜잭션 | 락을 갖고 있는 데이터 | 락을 기다리고 있는 데이터 |
---|---|---|
T1 | x2 | x1, x3 |
T2 | x3, x10 | x7, x8 |
T3 | x8 | x4, x5 |
T4 | x7 | x1 |
T5 | x1, x5 | x3 |
T6 | x4, x9 | x6 |
T7 | x6 | x5 |
대기 그래프 구성
- T1은 x1과 x3을 기다리고 있음
- x1은 T5가 보유: T1 → T5
- x3은 T2가 보유: T1 → T2
- T2는 x7과 x8을 기다리고 있음
- x7은 T4가 보유: T2 → T4
- x8은 T3가 보유: T2 → T3
- T3는 x4와 x5를 기다리고 있음
- x4은 T6가 보유: T3 → T6
- x5은 T5가 보유: T3 → T5
- T4는 x1을 기다리고 있음
- x1은 T5가 보유: T4 → T5
- T5는 x3을 기다리고 있음
- x3은 T2가 보유: T5 → T2
- T6는 x6을 기다리고 있음
- x6은 T7가 보유: T6 → T7
- T7는 x5을 기다리고 있음
- x5은 T5가 보유: T7 → T5
데드락은 대기 그래프에서 순환(cycle)이 존재할 때 발생함. 이 경우, 트랜잭션 T2 → T4 → T5 → T2 로 이어지는 순환 구조가 존재하므로 데드락이 발생함
- 다음은 어느 트랜잭션 T1, T2, T3의 로그 기록이다. 지연 갱신 방법을 사용한다고 가정하고 15번 로그에서 시스템 장애가 일어났을 때 각 트랜잭션 T1, T2, T3를 복구하는 방법에 대해 설명하시오.
로그 번호 | 로그 레코드 |
---|---|
1 | [T1, START] |
2 | [T1, UPDATE, B, 200, 120] |
3 | [T1, UPDATE, C, 300, 310] |
4 | [T2, START] |
5 | [T2, UPDATE, D, 110, 120] |
6 | [T1, UPDATE, A, 120, 110] |
7 | [T1, COMMIT] |
8 | [T2, UPDATE, E, 120, 220] |
9 | [CHECKPOINT] |
10 | [T3, START] |
11 | [T3, UPDATE, G, 110, 120] |
12 | [T2, UPDATE, F, 400, 410] |
13 | [T2, COMMIT] |
14 | [T3, UPDATE, H, 220, 230] |
15 | |
- T2의 변경 사항(E와 F에 대한 업데이트)은 반영되지 않았을 가능성이 있으므로 redo를 진행함 | |
- T1과 T3에 대해서는 별도의 조치가 필요하지 않음 |
'CSE > 데이터베이스 (database)' 카테고리의 다른 글
오라클로 배우는 데이터베이스 개론과 실습 2판 - 연습문제 9장 (0) | 2023.12.20 |
---|---|
오라클로 배우는 데이터베이스 개론과 실습 2판 - 연습문제 7장 (0) | 2023.12.18 |
오라클로 배우는 데이터베이스 개론과 실습 2판 - 연습문제 6장 (2) | 2023.12.18 |
오라클로 배우는 데이터베이스 개론과 실습 2판 - 연습문제 5장 (0) | 2023.12.17 |
오라클로 배우는 데이터베이스 개론과 실습 2판 - 마당서점 데이터베이스 구축 (0) | 2023.12.16 |
컴퓨터 전공 관련, 프론트엔드 개발 지식들을 공유합니다. React, Javascript를 다룰 줄 알며 요즘에는 Typescript에도 관심이 생겨 공부하고 있습니다. 서로 소통하면서 프로젝트 하는 것을 즐기며 많은 대외활동으로 개발 능력과 소프트 스킬을 다듬어나가고 있습니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!