15단원 '권한과 트랜잭션'의 네 레슨에서 6문제, 앞 단원(12·13)에서 2문제를 섞었고, 끝에 실기 꼴 3문제가 있습니다. 앞 단원 문제가 어느 레슨인지는 정답을 펼치면 보입니다. 문제의 SQL은 아래 네 표로 Oracle에서 돌린다고 보고 풀어 보세요. 실기 꼴은 종이에 답을 끝까지 쓴 뒤 펼치세요. 띄어쓰기만 다르면 같은 답입니다.
학과
| 학과코드 | 학과명 | 건물 |
|---|---|---|
| CS | 컴퓨터 | 공학관 |
| EE | 전자 | 공학관 |
| BA | 경영 | 경영관 |
학생
| 학번 | 이름 | 학년 | 학과코드 |
|---|---|---|---|
| 101 | 김민수 | 3 | CS |
| 102 | 이서준 | 2 | CS |
| 103 | 김지민 | 2 | CS |
| 104 | 박서연 | 1 | EE |
| 105 | 최민준 | 3 | EE |
| 106 | 정하윤 | 3 | EE |
| 107 | 강도현 | 1 | NULL |
과목
| 과목코드 | 과목명 | 학점 | 선수과목 |
|---|---|---|---|
| DS | 자료구조 | 3 | NULL |
| OS | 운영체제 | 3 | DS |
| NW | 네트워크 | 2 | OS |
수강
| 학번 | 과목코드 | 점수 |
|---|---|---|
| 101 | DS | 85 |
| 101 | OS | 75 |
| 101 | NW | 80 |
| 102 | DS | 70 |
| 102 | OS | 60 |
| 103 | DS | 65 |
| 103 | NW | 55 |
| 104 | OS | 75 |
| 104 | NW | 95 |
| 105 | DS | 100 |
| 105 | NW | 90 |
| 107 | NW | 50 |
문제 1
과목 표의 주인이 LEE에게 SELECT 권한을 다시 줄 권리까지 함께 줬습니다. LEE는 그 권한을 SONG에게 다시 줬습니다. 이제 주인이 다음 문장을 시험 꼴로 실행하면 어떻게 되는지 고르세요.
REVOKE SELECT ON 과목
FROM LEE RESTRICT;
- ① 회수가 거부되고 두 사람의 권한이 그대로 남는다
- ② LEE의 권한만 사라지고 SONG의 권한은 남는다
- ③ LEE의 권한과 SONG의 권한이 함께 사라진다
- ④ LEE의 권한은 남고 다시 줄 권리만 사라진다
정답
① — RESTRICT는 딸린 것이 있으면 하지 않습니다. LEE가 SONG에게 다시 준 권한이 있어 회수 자체가 거부되고, 두 사람의 권한은 그대로 남습니다.
- ② 받은 사람의 권한만 따로 거둔다고 봤습니다. 다시 준 권한이 있으면 RESTRICT는 회수를 거부하고, 아무것도 거두지 않습니다.
- ③ CASCADE의 동작으로 봤습니다. 다시 준 권한까지 연쇄로 거두는 쪽이 CASCADE입니다.
- ④ GRANT OPTION FOR의 동작으로 봤습니다. 그 말은 REVOKE 바로 뒤에 붙고, 권한은 남기고 다시 줄 권리만 거둡니다.
다시 볼 레슨: DCL: GRANT·REVOKE
문제 2
다음 두 문장을 시험 꼴로 적었습니다. 학생 표의 학과코드는 학과 표의 학과코드를 가리키고, YANG은 받은 SELECT 권한을 BAEK에게 다시 줬습니다. 두 CASCADE가 함께 없애는 것으로 알맞은 것을 고르세요.
DROP TABLE 학과 CASCADE;
REVOKE SELECT ON 학생
FROM YANG CASCADE;
- ① 학과 표를 가리키는 학생 표까지 지운다 · YANG이 받은 권한만 거둔다
- ② 학과 표를 가리키는 학생 표까지 지운다 · YANG이 BAEK에게 준 권한까지 거둔다
- ③ 학과 표를 가리키는 제약 조건과 뷰까지 지운다 · YANG이 BAEK에게 준 권한까지 거둔다
- ④ 학과 표를 가리키는 제약 조건과 뷰까지 지운다 · YANG이 받은 권한만 거둔다
정답
③ — DROP의 CASCADE는 지우는 표를 가리키던 제약 조건과 뷰를 없앱니다. 학생 표는 행 그대로 남고 학과코드를 검사하던 외래키 제약 조건만 사라집니다. REVOKE의 CASCADE는 받은 사람이 다시 준 권한까지 따라가 거두어, YANG과 BAEK의 권한이 함께 사라집니다.
- ① 두 자리를 모두 좁게 봤습니다. DROP은 가리키는 표가 아니라 그 제약 조건을 없애고, REVOKE는 다시 준 권한까지 거둡니다.
- ② DROP이 가리키는 표까지 통째로 없앤다고 봤습니다. 가리키는 표의 행은 남고, 그 표에 걸려 있던 제약 조건만 없어집니다.
- ④ REVOKE의 CASCADE를 받은 사람의 권한만 거두는 것으로 봤습니다. CASCADE는 그 사람이 다시 준 권한까지 따라갑니다.
다시 볼 레슨: DDL: CREATE·ALTER·DROP · DCL: GRANT·REVOKE
문제 3
다음 문장을 차례로 실행했습니다. 끝난 뒤 107번 강도현의 수강 행이 어떻게 되는지 고르세요.
DELETE FROM 수강
WHERE 학번 = 107;
COMMIT;
ROLLBACK;
SELECT COUNT(*) AS 행수
FROM 수강
WHERE 학번 = 107;
- ① ROLLBACK이 되돌려 행이 그대로 있다
- ② 지워진 채로 남아 행이 없다
- ③ ROLLBACK이 수강 표를 처음 상태로 되돌려 12행이 된다
- ④ COMMIT한 뒤의 ROLLBACK은 오류로 막힌다
정답
② — COMMIT이 끝난 트랜잭션은 완료 상태입니다. 완료한 변경은 ROLLBACK으로 되돌릴 수 없어, 107번 행은 지워진 채로 남습니다.
- ① ROLLBACK이 언제든 앞의 변경을 되돌린다고 봤습니다. 되돌릴 수 있는 것은 아직 확정하지 않은 변경뿐입니다.
- ③ ROLLBACK이 표 전체를 처음으로 돌려놓는다고 봤습니다. 되돌아가는 범위는 그 트랜잭션이 바꾼 것뿐이고, 확정한 뒤에는 그조차 남지 않습니다.
- ④ 되돌릴 것이 없는 ROLLBACK이 오류라고 봤습니다. 오류 없이 지나가고, 데이터베이스는 그대로입니다.
| 행수 |
|---|
| 0 |
다시 볼 레슨: 트랜잭션과 ACID
문제 4
학생 표를 고치는 트랜잭션이 마지막 문장까지 실행을 끝냈지만 아직 COMMIT을 하지 않았습니다. 이때의 상태가 (가)입니다. 그 뒤 더 진행할 수 없게 되어 바꾼 것을 모두 되돌리고 끝냈다면, 끝난 뒤의 상태가 (나)입니다. 알맞은 것을 고르세요.
- ① (가) 활동 · (나) 실패
- ② (가) 활동 · (나) 철회
- ③ (가) 부분 완료 · (나) 실패
- ④ (가) 부분 완료 · (나) 철회
정답
④ — 마지막 문장까지 끝났지만 확정하지 않은 상태가 부분 완료입니다. 바꾼 것을 모두 되돌려 시작 전으로 돌아가면 철회입니다.
- ① 두 자리를 모두 한 단계 앞으로 봤습니다. 활동은 문장이 도는 중이고, 실패는 멈추기만 하고 아직 되돌리지 않은 상태입니다.
- ② (나)는 맞게 봤지만 (가)를 활동으로 봤습니다. 마지막 문장까지 끝냈으면 활동을 지나 부분 완료입니다.
- ③ (가)는 맞게 봤지만 (나)를 실패로 봤습니다. 되돌리기를 마친 뒤의 이름이 철회입니다.
다시 볼 레슨: 트랜잭션과 ACID
문제 5
두 트랜잭션이 아래 차례로 돌았습니다. 시각 4 뒤에 벌어지는 일로 알맞은 것을 고르세요.
| 시각 | T1 | T2 |
|---|---|---|
| 1 | 수강 표 101번 OS 행에 배타 락을 걸고 점수를 고친다 | |
| 2 | 과목 표 OS 행에 배타 락을 걸고 학점을 고친다 | |
| 3 | 과목 표 OS 행을 고치려고 기다린다 | |
| 4 | 수강 표 101번 OS 행을 고치려고 기다린다 |
- ① 서로가 쥔 락을 기다려 멈추고, DBMS가 한쪽을 철회한다
- ② 먼저 락을 잡은 T1이 끝까지 돌고 T2가 철회된다
- ③ 배타 락은 쓰기만 막으므로 둘 다 기다리지 않고 끝난다
- ④ 2단계 로킹을 지켰으므로 이런 멈춤은 생기지 않는다
정답
① — T1이 기다리는 과목 표 OS 행의 락은 T2가 쥐고 있고, T2가 기다리는 수강 표 101번 OS 행의 락은 T1이 쥐고 있습니다. 둘 다 상대가 놓기를 기다려 영원히 멈추는 교착 상태입니다. DBMS가 이것을 찾아내 한쪽을 철회해 풀어 줍니다.
- ② 먼저 잡은 쪽이 끝까지 간다고 봤습니다. T1도 T2가 쥔 락을 기다려 끝낼 수 없어, 저절로 풀리지 않습니다.
- ③ 락이 걸린 행을 다른 트랜잭션이 고칠 수 있다고 봤습니다. 배타 락이 걸린 행은 읽지도 쓰지도 못하고, 둘은 모두 고치려고 기다립니다.
- ④ 2단계 로킹이 교착 상태까지 막는다고 봤습니다. 2단계 로킹은 차례로 실행한 것과 같은 결과를 보장하지만 교착 상태는 막지 못합니다.
다시 볼 레슨: 병행 제어
문제 6
격리 수준을 REPEATABLE READ로 둔 트랜잭션이 3학년 학생 수를 같은 조건으로 두 번 셌습니다. 두 번 사이에 다른 트랜잭션이 3학년 학생 한 명을 넣고 COMMIT했습니다. 두 번째 셈에 그 학생이 들어오는 현상의 이름이 (가), 이것을 막으려면 올려야 하는 격리 수준이 (나)입니다. 알맞은 것을 고르세요.
- ① (가) 반복 불가능 읽기 · (나) READ COMMITTED
- ② (가) 반복 불가능 읽기 · (나) SERIALIZABLE
- ③ (가) 유령 읽기 · (나) READ COMMITTED
- ④ (가) 유령 읽기 · (나) SERIALIZABLE
정답
④ — 같은 조건으로 다시 읽었는데 없던 행이 나타나는 것이 유령 읽기입니다. 네 격리 수준 가운데 유령 읽기를 막는 것은 SERIALIZABLE뿐입니다.
- ① 두 자리를 모두 낮춰 봤습니다. 같은 행의 값이 달라지는 것이 반복 불가능 읽기이고, READ COMMITTED는 REPEATABLE READ보다 낮아 더 막아 주지 않습니다.
- ② 행이 늘어난 것을 같은 행의 값이 달라진 것으로 봤습니다. 지금 수준이 이미 반복 불가능 읽기를 막고 있어, 남은 것은 유령 읽기입니다.
- ③ 현상은 맞게 봤지만 수준을 내려 봤습니다. 수준을 내리면 막던 이상까지 다시 생깁니다.
다시 볼 레슨: 병행 제어
문제 7
(가)와 (나)는 둘 다 고친 값이 어긋나거나 사라진 일입니다. 각각을 없애는 방법으로 알맞은 것을 고르세요.
-
(가) 동아리원 표(학번, 이름, 동아리명, 지도교수)에 학생마다 지도교수를 적어 두었습니다. 사진 동아리의 지도교수가 바뀌어 네 행을 고치다 한 행을 놓쳐, 같은 동아리의 지도교수가 둘이 되었습니다.
-
(나) 조교 둘이 같은 때 같은 점수 75를 읽어 각자 올려 썼습니다. 나중에 쓴 값만 남아 먼저 올린 몫이 사라졌습니다.
-
① 둘 다 표를 정규화해 나누면 사라진다
-
② (가)는 표를 정규화해 나누면, (나)는 락으로 차례를 만들면 사라진다
-
③ (가)는 락으로 차례를 만들면, (나)는 표를 정규화해 나누면 사라진다
-
④ 둘 다 락으로 차례를 만들면 사라진다
정답
② — (가)는 동아리에 딸린 사실인 지도교수가 학생 행마다 겹쳐 적혀서 생기는 갱신 이상입니다. 동아리원 표와 동아리 표로 나누면 지도교수가 한 곳에만 남아 어긋날 자리가 없어집니다. (나)는 같은 값을 둘이 함께 읽어서 생기는 갱신 분실입니다. 점수는 한 곳에만 적혀 있어 나눌 것이 없고, 읽는 순간부터 락을 걸어 차례를 만들면 막습니다.
- ① (나)도 표 설계 문제로 봤습니다. (나)의 점수는 겹쳐 적혀 있지 않고, 같은 때 둘이 고쳐서 생긴 일입니다.
- ③ 둘을 거꾸로 봤습니다. 겹쳐 적힌 값이 어긋나는 쪽이 설계 문제이고, 동시에 쓴 값이 덮이는 쪽이 병행 제어 문제입니다.
- ④ (가)도 동시 실행 문제로 봤습니다. (가)는 한 사람이 혼자 고쳐도, 겹쳐 적힌 네 행을 다 고치지 않으면 생깁니다.
문제 8
지연 갱신을 쓰는 시스템에서 트랜잭션 T가 값 둘을 고치던 중, COMMIT을 적지 못하고 장애가 났습니다. 회복할 때 T에 하는 일로 알맞은 것을 고르세요.
- ① 로그의 바꾸기 전 값을 꺼내 데이터베이스를 그 값으로 되돌린다
- ② 로그의 바꾼 뒤 값을 꺼내 데이터베이스에 다시 반영한다
- ③ 되돌릴 것이 없어 아무것도 하지 않는다
- ④ 백업으로 데이터베이스를 되살린 뒤 로그로 다시 반영한다
정답
③ — 지연 갱신은 COMMIT할 때까지 데이터베이스를 건드리지 않고 로그에만 적습니다. COMMIT을 적지 못한 T의 변경은 데이터베이스에 들어간 적이 없어 되돌릴 것이 없습니다. 그래서 지연 갱신의 회복에는 REDO만 씁니다.
- ① 즉시 갱신의 회복으로 봤습니다. 도는 중에 바로 반영하는 즉시 갱신에서는 끝내지 못한 변경이 들어가 있을 수 있어 UNDO가 필요합니다.
- ② COMMIT이 적힌 트랜잭션에 하는 일입니다. T는 COMMIT을 적지 못했습니다.
- ④ 미디어 장애의 회복으로 봤습니다. 백업으로 되살리는 것은 디스크가 망가져 데이터를 읽을 수 없을 때입니다.
다시 볼 레슨: 회복
문제 9 (실기)
트랜잭션의 네 특성 가운데 (가)·(나)에 맞는 이름을 한글로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
- (가) 학과 사무실에서 수강 정정을 확정했다는 응답을 받았습니다. 그날 밤 서버의 전원이 나갔는데도, 다시 올린 뒤 정정 내용이 그대로 있습니다.
- (나) 조교가 점수를 고치는 중입니다. 아직 확정하지 않은 사이에 다른 조교가 그 행을 읽으면 고치기 전 점수가 보입니다.
정답
받는 답: (가) 영속성 또는 지속성 · (나) 독립성 또는 격리성 또는 고립성
(가)의 실마리는 '확정한 뒤 장애가 나도 남는다', (나)는 '확정하지 않은 값이 남에게 보이지 않는다'입니다. 지속성·격리성·고립성은 자료에 따라 부르는 이름이라 함께 받습니다.
- 같은 이름의 다른 꼴: (가) Durability · (나) Isolation — 영문 원어입니다. 문제가 한글로 물었습니다.
- 틀리는 꼴 원자성 — (가)에: 묶음이 모두 반영되거나 하나도 반영되지 않는 성질입니다. 확정한 결과가 장애 뒤에도 남는 것은 영속성입니다.
- 틀리는 꼴 일관성 — (나)에: 트랜잭션 앞뒤로 정해 둔 규칙을 지키는 성질입니다. 중간 값이 남에게 보이지 않는 것은 독립성입니다.
다시 볼 레슨: 트랜잭션과 ACID
문제 10 (실기)
장애가 난 뒤 로그를 보니, 마지막 검사점 뒤에 T1의 COMMIT은 적혀 있고 T2의 COMMIT은 없습니다. 회복할 때 T1의 변경에 하는 연산의 이름을 영문으로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
정답
받는 답: REDO
실마리는 'T1의 COMMIT이 로그에 있다'입니다. 끝까지 마친 트랜잭션의 변경은 로그의 바꾼 뒤 값을 꺼내 다시 반영해 살립니다.
- 같은 이름의 다른 꼴: 재실행 — 한글 이름입니다. 문제가 영문으로 물었습니다.
- 틀리는 꼴 UNDO: 바꾸기 전 값으로 되돌리는 연산이고, COMMIT이 적히지 않은 T2가 그 대상입니다.
- 틀리는 꼴 ROLLBACK: 트랜잭션을 취소하는 SQL 명령입니다. 회복할 때 데이터베이스가 하는 연산의 이름이 아닙니다.
다시 볼 레슨: 회복
문제 11 (실기)
수강 표의 기본키는 (학번, 과목코드)입니다. 이미 있는 101번의 DS 행을 한 번 더 넣으려 하자 DBMS가 거절했습니다. 이때 지켜진 무결성의 이름을 한글로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
정답
받는 답: 개체 무결성
실마리는 '기본키 값이 이미 있는 행과 겹친다'입니다. 기본키는 비어서도, 겹쳐서도 안 됩니다.
- 같은 이름의 다른 꼴: Entity Integrity — 영문 원어입니다. 문제가 한글로 물었습니다.
- 틀리는 꼴 일관성: 트랜잭션 앞뒤로 데이터베이스가 정해 둔 규칙을 지키는 ACID의 특성 이름입니다. 묻는 것은 그 규칙, 곧 무결성의 이름입니다.
- 틀리는 꼴 참조 무결성: 외래키 값이 가리키는 표에 있어야 한다는 제약입니다. 101과 DS는 둘 다 가리키는 표에 있는 값입니다.
다시 볼 레슨: 무결성 제약 조건