데이터베이스 기초

트랜잭션을 동시에 실행했을 때 일어나는 문제 중 더티 리드에 대한 설명으로 올바른 것은?

  1. A다른 트랜잭션이 아직 커밋하지 않은 갱신을 읽었는데, 그 트랜잭션이 롤백했기 때문에 존재하지 않았던 값을 사용해 버린다
  2. B같은 트랜잭션 안에서 같은 행을 두 번 읽으면, 그 사이에 다른 트랜잭션이 그 행을 갱신하고 커밋했기 때문에 값이 바뀌어 있다
  3. C같은 조건의 검색을 두 번 하면, 그 사이에 다른 트랜잭션이 행을 추가하고 커밋했기 때문에 행의 수가 바뀌어 있다
정답과 해설 보기

정답: A. 다른 트랜잭션이 아직 커밋하지 않은 갱신을 읽었는데, 그 트랜잭션이 롤백했기 때문에 존재하지 않았던 값을 사용해 버린다

더티 리드는 커밋되지 않은(확정되지 않은) 데이터를 읽어 버리는 문제입니다. 갱신한 트랜잭션이 나중에 롤백하면, 읽은 값은 한 번도 확정되지 않은 값이 되어 그것을 바탕으로 한 처리가 잘못됩니다. 같은 행을 두 번 읽었더니 값이 바뀌어 있었다는 것은 반복 불가능한 읽기(non-repeatable read)이고, 검색 조건에 맞는 행이 늘거나 줄어든 것은 팬텀 리드(팬텀)입니다. 이것들은 트랜잭션의 고립성(독립성)이 충분하지 않아서 일어나는 문제로, SQL에서는 격리 수준을 설정하여 어디까지 막을지를 고릅니다. READ COMMITTED 이상의 격리 수준에서는 더티 리드가 일어나지 않습니다.

이 분야 연습하기 분야로 돌아가기

데이터베이스 기초의 다른 문제

  1. 트랜잭션 T1이 SELECT COUNT(*) FROM 주문 WHERE 금액 >= 1000을 실행했더니 8건이었다. 그 직후 T2가 금액 2000인 주문 행을 INSERT하고 커밋했다. T1이 같은 SELECT 문을 다시 실행하자 9건이 되었다. 이 현상은?
  2. SQL 표준 규격이 정하는 격리 수준 중 READ COMMITTED에서 일어날 수 있는 현상의 조합으로 올바른 것은?
  3. 트랜잭션 T1이 어떤 행에 공유 락을 걸고 읽고 있다. 이 행에 대해 T2가 공유 락을, T3가 배타 락을 요구했다. T1이 락을 해제할 때까지의 동안에 대해 올바른 것은?
  4. 트랜잭션의 동시성 제어에 사용되는 2단계 로킹 방식에 대한 설명으로 올바른 것은?
  5. 트랜잭션 T1은 행 A에 배타 락을 건 뒤 행 B의 락을 요구하고, T2는 행 B에 배타 락을 건 뒤 행 A의 락을 요구했기 때문에 둘 다 앞으로 나아갈 수 없게 되었다. DBMS가 이 상태를 감지했을 때 하는 일반적인 대처는?