데이터베이스 기초

계좌 표에서 트랜잭션을 시작하고, 계좌 A의 잔액에서 300을 빼는 UPDATE와 계좌 B의 잔액에 300을 더하는 UPDATE를 실행했다. 그 후 COMMIT 대신 ROLLBACK을 실행했다. 계좌 표는 어떻게 되는가?

  1. A계좌 B에 대한 가산만 취소되고 계좌 A의 감산은 남는다
  2. B두 UPDATE가 모두 취소되어 트랜잭션을 시작하기 전의 상태로 돌아간다
  3. CUPDATE는 이미 실행되었으므로 어느 것도 취소되지 않는다
정답과 해설 보기

정답: B. 두 UPDATE가 모두 취소되어 트랜잭션을 시작하기 전의 상태로 돌아간다

트랜잭션은 데이터베이스에 대한 일련의 처리를 묶어서 하나의 단위로 다루는 구조입니다. 트랜잭션 안에서 수행한 갱신은 COMMIT을 실행하면 확정되고, ROLLBACK을 실행하면 모두 취소되어 트랜잭션을 시작하기 전의 상태로 돌아갑니다. 이 예에서는 계좌 A의 감산과 계좌 B의 가산이 모두 취소되어 두 계좌의 잔액은 원래 그대로입니다. 이체 도중에 오류가 일어났을 때 ROLLBACK하면, 한쪽 계좌만 갱신된 어중간한 상태가 남지 않습니다. 일부만 취소하고 싶은 경우에는 SAVEPOINT로 중간에 표시를 해 두고 ROLLBACK TO SAVEPOINT로 거기까지 되돌리는 방법도 있습니다.

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

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

  1. 트랜잭션이 가져야 할 ACID 특성 중 '계좌 A에서 출금하여 계좌 B에 입금하는 이체 처리가, 도중에 장애가 일어나도 둘 다 수행되거나 전혀 수행되지 않거나 둘 중 하나가 된다'는 성질은?
  2. 재고 표에서 어떤 상품의 재고 수는 10이다. 트랜잭션 T1은 재고 수를 읽어 3을 뺀 값을 쓰고, T2는 재고 수를 읽어 5를 뺀 값을 쓴다. 락을 걸지 않고 T1의 읽기, T2의 읽기, T1의 쓰기, T2의 쓰기 순서로 실행되었을 때 최종 재고 수는 얼마가 되는가?
  3. 트랜잭션을 동시에 실행했을 때 일어나는 문제 중 더티 리드에 대한 설명으로 올바른 것은?
  4. 트랜잭션 T1이 SELECT COUNT(*) FROM 주문 WHERE 금액 >= 1000을 실행했더니 8건이었다. 그 직후 T2가 금액 2000인 주문 행을 INSERT하고 커밋했다. T1이 같은 SELECT 문을 다시 실행하자 9건이 되었다. 이 현상은?
  5. SQL 표준 규격이 정하는 격리 수준 중 READ COMMITTED에서 일어날 수 있는 현상의 조합으로 올바른 것은?