트랜잭션(Transaction)란?

데이터베이스에 대한 일련의 처리를 묶어서 하나의 단위로 다루는 것. COMMIT으로 처리 결과를 확정하고, ROLLBACK으로 시작 전의 상태로 되돌린다. 원자성·일관성·고립성·지속성(ACID 특성)을 만족하도록 DBMS가 락이나 로그를 사용하여 관리한다.

일본어 명칭: トランザクション

트랜잭션(Transaction)은(는) 데이터베이스 기초 등 1개 분야의 연습 문제 13개에 나와요.

분야: 데이터베이스 기초

COMMIT과 ROLLBACK

은행 이체에서는 계좌 A에서 출금하는 처리와 계좌 B에 입금하는 처리가 둘 다 갖추어져야 비로소 올바른 결과가 됩니다. 트랜잭션은 이러한 일련의 처리를 하나의 단위로 묶어, 마지막에 COMMIT을 실행하면 결과가 확정되고, 도중에 오류가 일어났을 때 등에 ROLLBACK을 실행하면 트랜잭션 안의 모든 갱신이 취소됩니다. COMMIT하지 않은 갱신은 장애가 일어난 경우에도 취소되어, 일부만 반영된 어중간한 상태는 남지 않습니다.

동시 실행 제어

많은 이용자가 동시에 데이터베이스를 사용하면 여러 트랜잭션이 같은 데이터를 읽고 씁니다. 아무것도 제어하지 않으면 한쪽의 갱신이 다른 쪽의 갱신으로 덮어써져 사라지거나(갱신 손실), 커밋되지 않은 데이터를 읽는(더티 리드) 등의 문제가 생깁니다. DBMS는 공유 락과 배타 락을 사용하는 동시성 제어나, 갱신 전의 버전을 남겨 읽기에 사용하는 다중 버전 동시성 제어(MVCC) 등으로 트랜잭션끼리의 간섭을 막습니다. 어디까지 막을지는 격리 수준으로 고릅니다.

장애로부터의 복구

DBMS는 갱신 전후의 값을 로그에 기록하고, 로그를 데이터베이스 본체보다 먼저 저장 장치에 씁니다. 장애가 일어난 뒤에는 로그를 바탕으로 커밋된 트랜잭션의 갱신을 다시 수행하고(롤포워드), 커밋하지 않은 트랜잭션의 갱신을 취소하여(롤백) 올바른 상태로 되돌립니다. 정기적으로 체크포인트를 잡아 두면 복구할 때 따라가는 로그의 범위를 짧게 할 수 있습니다.

도전해 보기: 트랜잭션(Transaction) 관련 문제

계좌 표에서 트랜잭션을 시작하고, 계좌 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로 거기까지 되돌리는 방법도 있습니다.

트랜잭션이 가져야 할 ACID 특성 중 '계좌 A에서 출금하여 계좌 B에 입금하는 이체 처리가, 도중에 장애가 일어나도 둘 다 수행되거나 전혀 수행되지 않거나 둘 중 하나가 된다'는 성질은?

  1. A일관성(Consistency)
  2. B지속성(Durability)
  3. C원자성(Atomicity)
정답과 해설 보기

정답: C. 원자성(Atomicity)

ACID 특성은 트랜잭션이 만족해야 할 4가지 성질의 머리글자를 딴 것입니다. 원자성(Atomicity)은 트랜잭션 안의 처리가 모두 실행되거나 전혀 실행되지 않거나 둘 중 하나가 되는 성질로, 장애가 일어났을 때는 도중까지의 갱신을 취소합니다. 일관성(Consistency)은 트랜잭션 전후에 데이터가 정합성 제약(잔액이 음수가 되지 않는다, 외래 키의 참조 대상이 있다 등)을 계속 만족하는 성질입니다. 고립성(Isolation, 독립성)은 동시에 실행되는 여러 트랜잭션이 서로 간섭하지 않고, 하나씩 차례로 실행한 경우와 같은 결과가 되는 성질입니다. 지속성(Durability, 영속성)은 커밋한 트랜잭션의 결과가 그 후에 장애가 일어나도 사라지지 않는 성질입니다. 문제의 '전부 아니면 전무' 성질은 원자성입니다.

자주 묻는 질문

트랜잭션 도중에 오류가 일어나면 어떻게 되나요?

애플리케이션이 ROLLBACK을 실행하거나 DBMS가 장애 복구 처리를 수행함으로써, 그 트랜잭션 안의 갱신은 모두 취소됩니다. 일부 갱신만 남는 일은 없습니다.

트랜잭션을 길게 하면 어떤 문제가 있나요?

오랜 시간 락을 계속 가지고 있으므로 다른 트랜잭션이 기다리게 되어 동시에 처리할 수 있는 양이 줄고, 데드락도 일어나기 쉬워집니다. 트랜잭션은 정합성을 유지하는 데 필요한 범위에서 짧게 하는 것이 기본입니다.

해설 속 트랜잭션(Transaction)

트랜잭션(Transaction)이(가) 나오는 문제 (13)

  1. 계좌 표에서 트랜잭션을 시작하고, 계좌 A의 잔액에서 300을 빼는 UPDATE와 계좌 B의 잔액에 300을 더하는 UPDATE를 실행했다. 그 후 COMMIT 대신 ROLLBACK을 실행했다. 계좌 표는 어떻게 되는가?
  2. 트랜잭션이 가져야 할 ACID 특성 중 '계좌 A에서 출금하여 계좌 B에 입금하는 이체 처리가, 도중에 장애가 일어나도 둘 다 수행되거나 전혀 수행되지 않거나 둘 중 하나가 된다'는 성질은?
  3. 재고 표에서 어떤 상품의 재고 수는 10이다. 트랜잭션 T1은 재고 수를 읽어 3을 뺀 값을 쓰고, T2는 재고 수를 읽어 5를 뺀 값을 쓴다. 락을 걸지 않고 T1의 읽기, T2의 읽기, T1의 쓰기, T2의 쓰기 순서로 실행되었을 때 최종 재고 수는 얼마가 되는가?
  4. 트랜잭션을 동시에 실행했을 때 일어나는 문제 중 더티 리드에 대한 설명으로 올바른 것은?
  5. 트랜잭션 T1이 SELECT COUNT(*) FROM 주문 WHERE 금액 >= 1000을 실행했더니 8건이었다. 그 직후 T2가 금액 2000인 주문 행을 INSERT하고 커밋했다. T1이 같은 SELECT 문을 다시 실행하자 9건이 되었다. 이 현상은?
  6. 트랜잭션 T1이 어떤 행에 공유 락을 걸고 읽고 있다. 이 행에 대해 T2가 공유 락을, T3가 배타 락을 요구했다. T1이 락을 해제할 때까지의 동안에 대해 올바른 것은?
  7. 트랜잭션의 동시성 제어에 사용되는 2단계 로킹 방식에 대한 설명으로 올바른 것은?
  8. 트랜잭션 T1은 행 A에 배타 락을 건 뒤 행 B의 락을 요구하고, T2는 행 B에 배타 락을 건 뒤 행 A의 락을 요구했기 때문에 둘 다 앞으로 나아갈 수 없게 되었다. DBMS가 이 상태를 감지했을 때 하는 일반적인 대처는?
  9. 트랜잭션 T1~T5가 있고, 장애가 발생하기 전에 체크포인트를 한 번 잡았다. T1은 체크포인트 전에 시작하여 커밋했다. T2와 T3는 체크포인트 전에 시작했으며, T2는 체크포인트 후 장애 전에 커밋했고, T3는 장애 시점에 커밋하지 않았다. T4와 T5는 체크포인트 후에 시작했으며, T4는 장애 전에 커밋했고, T5는 커밋하지 않았다. 장애 후의 복구에서 로그를 사용하여 롤포워드해야 하는 트랜잭션은?
  10. SQL 문은 데이터 정의어(DDL), 데이터 조작어(DML), 데이터 제어어(DCL)로 나뉜다. DDL로 분류되는 것은?
  11. SQL에서 DELETE FROM 사원을 WHERE 절 없이 실행했을 때의 결과로 올바른 것은?
  12. SQL 표준 규격이 정하는 격리 수준 중 READ COMMITTED에서 일어날 수 있는 현상의 조합으로 올바른 것은?
  13. 많은 DBMS는 데이터를 갱신할 때 갱신 내용을 로그(저널)에 기록하고, 그 로그를 데이터베이스 본체보다 먼저 비휘발성 저장 장치에 쓴다(WAL: 로그 선행 기록). 이 방식을 취하는 주된 이유는?

관련 용어

SQL 격리 수준(Isolation Level) ACID 특성(ACID Properties) 데드락(Deadlock) 외래 키(Foreign Key) 2단계 로킹(2PL) 인덱스(Index) 관계형 데이터베이스(Relational Database) 기본 키(Primary Key) 뷰(View)

용어집으로 돌아가기