제 2장 문제 21 ~ 31

Kyojun Jin·2023년 1월 9일
0

SQLP

목록 보기
18/34

21. 공통기술팀에서 개발표준 업무를 담당하는 고성능 씨가 Lock 경합에 의한 성능 저하를 최소화하기 위해 개발팀에 제시한 가아드라안으로 가장 부적절한 것은?

  1. 트랜잭션의 원자성을 훼손하지 않는 선에서 트랜잭션을 가능한 짧게 정의할 것
  2. 같은 데이터를 갱신하는 프로그램이 가급적 동시에 수행되지 않도록 트랜잭션을 설계할 것
  3. select 문장에 for update 문장을 사용하지 말 것
  4. 온라인 트랜잭션을 처리하는 DML 문장을 1순위로 튜닝함으로써 조건 절에 맞는 최적의 인덱스를 제공할 것

해설

  1. 데이터베이스의 동시성과 일관성은 tradeoff 관계에 있다. 최대한 동시성을 늘리기 위해서 트랜잭션을 가능한 짧게 정의하는 것이 좋다.
  2. 데이터베이스의 일관성을 높이기 위해 동시에 수행되지 않도록 설계하는 것이 좋다.
  3. repeatable read 를 방지하기 위해 select ... for update가 필요할 수 있다. 이는 선행 트랜잭션이 select를 두 번 이상 반복할 때, 후행 트랜잭션에 의한 갱신에 의해 잘못된 값이 읽히지 않도록 한다.
  4. 온라인 트랜잭션이 1순위이다.

22. MS-SQL Server에서 아래 UPDATE문과 블록킹 없이 동시 수행이 가능한 SQL문을 보기에서 고르시오, (단, Transaction Isolation Level을 조정하지 않았고, Snapshot 관련 데이터베이스 설정도 초기값 그대로인 상황이다.)

  1. select * from emp where empno = 7900
  2. update emp set sal = sal * 1.1 where empno = 7900
  3. delete from emp where empno = 7903
  4. insert into emp(empno, ename, deptno, sal) values(8014, '이정훈', 40, 4000)

해설

주어진 sql문은 20번 부서 사람들의 월급을 10% 인상한다.
4번은 부서번호가 40번이라서 블로킹 없이 실행될 수 있다.

23. 다음 중 오라클 pu/SQL로 작성한 아래 프로그램을 MS-SQL Server T-SQL 구문으로 변환하고자 한다. 아래 FOR UPDATE 구문을 대신하기 위해 사용할 SQL Server 힌트로 가장 적절한 것을 2개 고르시오

  1. from 고객 WITH (HOLDLOCK)
  2. from 고객 WITH (UPDLOCK)
  3. from 고객 WITH (READPAST)
  4. from 고객 WITH (TABLOCK)

해설

갱신할 때 쓰이는 공유락(holdlock)과 updlock 이 맞다.
readpast는 lock이 걸린 행을 읽지 않고 지나갈 때 쓰인다.
tablock은 테이블 레벨 lock이다.

24. 다음 중 아래와 같은 락(Lock) 모니터링 결과가 발생할 수있는 SQL로 가장 적절한 것은?

  1. INSERT INTO EMP (EMPNO, ENAME) VALUES (1000, ’SQLP’);
  2. UPDATE EMP SET SAL = 1000 WHERE EMPNO = 7369;
  3. INSERT /* + APPEND */ INTO EMP SELECT * FROM SCOTT. EMP;
  4. SELECT * FROM EMP WHERE EMPNO = 7369 FOR UPDATE;

해설

테이블 Lock(=TM Lock)이 Exclusive 모드이므로 Append 모드로 입력한 ③번 SQL 실행 후 Lock 발생현황을 모니터링한 결과이다.

25. 아래는 두 세션에서 각각 update 문을 수행한 후의 오라클 Lock 관련 조회 결과이다. 다음 중 ㄱ, ㄴ에 들어갈 용어로 가장 적절한 것은?

  1. ㄱ: Row-X (SX), ㄴ: S/Row—X (SSX)
  2. ㄱ: Row-X (SX), ㄴ: Exclusive
  3. ㄱ: Row-S (SS), ㄴ: S/Row-X (SSX)
  4. ㄱ: Row-S (SS), ㄴ: Exclusive

해설

ㄱ은 TM DML, 테이블 락이고, ㄴ은 트랜잭션 락이다.
오라클에서 update 시에는 테이블 락은 공유, 로우 락은 exclusive 로 동작한다.

26. 다음 중 아래는 트랜잭션의 특징을 연결한 것으로 가장 적절한 것은?


가. 더 이상 분해가 불가능한 업무의 최소단위를 말한다.

나. 트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 변환한다. 즉, 트랜잭션 실행의 결과로 데이터베이스 상태가 모순되지 않는다.

다. 트랜잭션이 실행 중에 생성하는 연산의 중간 결과는 다른 트랜잭션이 접근할 수 없다.

라. 트랜잭션이 일단 그 실행을 성공적으로 완료하면 그 결과는 데이터베이스에 영속적으로 저장된다.


  1. 원자성 - 가. , 격리성 - 나.
  2. 일관성 — 가. , 격리성 - 다.
  3. 영속성 - 나. , 일관성 - 다.
  4. 영속성 - 라. , 일관성 - 나.

해설

가 - 원자성 (Atomic)
나 - 일관성 (Consistency)
다 - 고립성 (Isolation)
라 - 영속성 (Durability)

27. 아래와 같이 100번 새션(SID=100)과 200번 세션(SID=200)에서 쿼리를 순차 적으로 실행했을 때 (가), (나)의 결과로 가장 적절한 것은?

  1. (가) 0, (나) 5
  2. (가) 0. (나) 6
  3. (가) 5, (나) 0
  4. (가) 5, (나) 1

해설

세션 100의 맨 처음에 트랜잭션 고립화 레벨을 3, Serializable 로 설정했다.
이는 Phantom read를 방지하기 위해 후행 트랜잭션의 삽입 및 갱신을 막는다.
따라서, 세션 200에서 11을 추가하고 cl이 6 이상인 것들을 1로 만드는 쿼리가 보류된다.
그래서 가 지점에선 아직 cl이 6 이상인 것이 6, 7, 8, 9, 10 이 있으므로 5가 나온다.
이후 12를 삽입해서 1 ~ 12가 되고
세션 100이 커밋하는 순간 이전에 보류됐던 게 다시 반영이 돼서 (문장 수준의 읽기 일관성 때문에) 6부터 11이 다 1이 된다.
결과적으로 테이블은 1, 1, 1, ... 1, 12가 돼서
나 지점에선 1이 나온다.

28. 다음 중 대부분 WMS가 채택하고 있는 기본 트랜잭션 격리성 수준(Transaction Isolation Level)인 것은?

  1. Read Uncommitted
  2. Read Committed
  3. Repeatable Read
  4. Serializable

해설

대부분 Read Committed 상태에서 출발한다.

29. 다음 중 트랜잭션 동시성 제어에 대한 설명으로 가장 부적절한 것은?

  1. 비관적 동시성 제어(Pessimistic Concurrency Control)는 두 트랜잭 션이 같은 데이터를 동시에 수정할 것이라고 가정하고 데이터를 읽는 시점에 Lock을 설정하는 방식을 말한다.
  2. 낙관적 동시성 제어(Optimistic Concurrency Control)는 두 트랜잭션 이 같은 데이터를 동시에 수정하지 않을 것이라고 가정하고 데이터를 읽는 시점에 Lock< 설정하지 않는 방식을 말한다 이 방식에선 데이터를 수정하는 시점에, 앞서 읽은 데이터가 다른 트랜잭션에 의해 변경되었는지 반드시 확인해야 데이터 정합성을 유지할 수 있다.
  3. 트랜잭션 격리성 수준(Transaction Isolation Level)을 Serializable로 상향 조정하면 일반적으로 동시성과 일관성이 같이 높아진다.
  4. 트랜잭션 격리성 수준(Transaction Isolation Level)을 Serializable로 상향 조정하면 프로그램에서 별도의 동시성 제어를 하지 않아도 DBMS가 트랜잭션 단위 일관성을 보장해 준다.

해설

트랜잭션 고립화 레벨을 Serializable 로 설정하면 동시성이 낮아진다.

30. EMP 테이블 7788번 사원의 SAL 값이 현재 1,000인 상황에서 아래 TX1, TX2 두 개의 트랜잭션이 동시에 수행되었다. 양쪽 트랜잭션이 모두 완료된 시점에 7788번 사원의 SAL 값은 Oracle과 SQL Server에서 각각 얼마인지 작성하사오. (Oracle과 SQL Server 순으로 적으사오. 단, Transaction Isolation Level을 조정하지 않았고, Snapshot 관련 데이터베아스 설정도 초기값 그대로인 상황이다.)

답: 2000, 3000

해설

Transaction Isolation Level 을 안 건드렸으면 Read Committed 로 동작한다.
오라클에서는 TX2가 사원번호가 7788이고 급여가 2000인 사원을 찾을 수가 없을 것이다.
왜냐하면 이 문장이 시작될 당시는 TX1이 commit하기 전이라서, 문장 읽기 일관성에 의해 아직 7788 사원의 급여는 1000이기 때문이다.
따라서 TX2는 반영이 되지 않고 급여는 그대로 2000이 된다.

다만 SQL에서는 TX1이 실행되는 순간 7788 사원의 로우에 대해 공유락이 걸린다.
때문에 TX1의 commit이 끝난 후 TX2가 실행이 되고, 7788 사원을 타게팅할 수 있다.
따라서 급여가 3000으로 갱신이 된다.

31. 다중버전 동시성 제어(Multiversion Concurrency Control, 이하 MVCC) 모델을 채택하는 DBMS가 늘고 있다. 다음 중 DBMS의 읽기 일관성 메커니즘을 설명한 것으로 가장 부적절한 것은?

  1. 읽기 일관성을 위해 Undo 세그먼트(또는 버전 저장소)에 저장된 Undo (또는 Snapshot) 데이터를 활용한다.
  2. MVCC 모델은 기본적으로 완벽한 문장 수준 읽기 일관성을 보장한다.
  3. MVCC 모델은 기본적으로 완벽한 트랜잭션 수준 읽기 일관성을 보장한다.
  4. 트랜잭션 수준 읽기 일관성이란, 트랜잭션이 시작된 시점을 기준으로 일관성 있게 데이터를 읽어들이는 것을 말한다.

해설

  1. 오라클에서는 SCN(System Commit Number)을 이용해서 버전을 관리한다.
  2. 버전 관리를 통해 가능하다. (snapshot too old 에러가 발생하지 않는다면)
  3. MVCC는 완벽한 트랜잭션 읽기 일관성을 보장하지 않는다.
  4. 맞다.

0개의 댓글