데이터베이스 트랜잭션
Database ·트랜잭션이란?
- 데이터베이스의 일의 단위 (a unit of database work)
- 하나의 거래를 안전하게 처리하도록 보장해주는 것
- 데이터베이스는 기본적으로 자동 커밋이 되어있어서
수동 커밋으로 설정해야 트랜잭션을 시작할 수 있음 - 비즈니스 로직이 있는 서비스 계층에서 시작해야
로직으로 인해 문제가 되는 부분을 함께 롤백 가능 -
애플리케이션에서 DB 트랜잭션을 사용하려면 트랜잭션을
사용하는 동안 같은 커넥션을 유지해야 한다.
그래야 같은 세션을 사용할 수 있다.
트랜잭션의 특성 (ACID)
- 원자성 (Atomicity)
- 한 트랜잭션 내의 모든 연산들이 완전히 수행되거나 전혀 수행되지 않음
- DBMS의 회복 모듈은 시스템이 다운되는 경우에, 부분적으로 데이터베이스를 갱신한 트랜잭션의 영향을 취소함으로써 트랜잭션의 원자성을 보장
- 완료된 트랜잭션이 갱신한 사항은 트랜잭션의 영향을 재수행함으로써 트랜잭션의 원자성을 보장
- 일관성 (Consistency)
- 어떤 트랜잭션이 수행되기 전에 데이터베이스가 일관된 상태를 가졌다면 트랜잭션이 수행된 후에 데이터베이스는 또 다른 일관된 상태를 가짐
- 고립성 (Isolation)
- 한 트랜잭션이 데이터를 갱신하는 동안 이 트랜잭션이 완료되기 전에는 갱신 중인 데이터를 다른 트랜잭션들이 접근하지 못하도록 해야 함
- 다수의 트랜잭션들이 동시에 수행되더라도 그 결과는 어떤 순서에 따라 트랜잭션들을 하나씩 차례대로 수행한 결과와 같아야 함
- DBMS의 동시성 제어 모듈이 트랜잭션의 고립성을 보장함
- 지속성 (Durability)
- 한 트랜잭션이 완료되면 이 트랜잭션이 갱신한 것은 그 후에 시스템에 고장이 발생하더라도 손실되지 않음
- 완료된 트랜잭션의 효과는 시스테이 고장이 난 경우에도 데이터베이스에 반영됨
- DBMS의 회복 모듈은 시스템이 다운되는 경우에도 트랜잭션의 지속성을 보장함
트랜잭션 격리 수준 - Isolation level
- 트랜잭션끼리 얼마나 서로 고립되어 있는지, 어떻게 DB 락을 걸 것인지
- 아래로 내려갈수록 트랜잭션간 고립 정도가 높고, 성능이 떨어짐
- 격리 수준은 크게 4단계로 나뉨
- 일반적으로 READ COMMITTED나 REPEATABLE READ 사용
- READ UNCOMMITED(커밋되지 않은 읽기)
- 다른 트랜잭션에서 커밋되지 않은 내용도 참조할 수 있다
- READ COMMITTED(커밋된 읽기)
- 다른 트랜잭션에서 커밋된 내용만 참조할 수 있다.
- REPEATABLE READ(반복 가능한 읽기)
- 트랜잭션에 진입하기 이전에 커밋된 내용만 참조할 수 있다.
- SERIALIZABLE(직렬화 가능)
- 트랜잭션에 진입하면 락을 걸어 다른 트랜잭션이 접근하지 못하게 한다.
동시성 제어
- 동시에 수행되는 트랜잭션들이 데이터베이스에 미치는 영향은 이들을 순차적으로 수행하였을 때 데이터베이스에 미치는 영향과 같도록 보장
- 다수 사용자가 데이터베이스를 동시에 접근하도록 허용하면서 일관성 유지
- 여러 사용자나 여러 응용 프로그램들이 동시에 수행되어도 서로 간섭하지 못하도록 보장
- 동시성 제어를 하지 않을 때의 문제점
- 갱신 손실 (lost update) - 수행 중인 트랜잭션이 갱신한 내용을 다른 트랜잭션이 덮어씀으로써 갱신이 무효가 되는 것
- 오손 데이터 읽기 (dirty read) - 완료되지 않은 트랜잭션이 갱신한 데이터를 읽는 것
- 반복할 수 없는 읽기 (unrepeatable read) - 한 트랜잭션이 동일한 데이터를 두 번 읽을 때 서로 다른 값을 읽음
- 동시성 제어 기법
- 타임 스탬프 순서 - 트랜잭션 실행 전의 time stamp 부여해 시간에 따라 수행
- 로킹 - 각 트랜잭션이 데이터 항목에 접근 할 때마다 lock을 거는 기법
회복
- 데이터베이스를 장애발생 이전의 일관된 상태로 복원시키는 것
- 일관된 상태란 데이터베이스에 오류가 없는 상태
- 고장이 발생하기 전에 트랜잭션이 완료 명령을 수행했다면 회복 모듈은 이 트랜잭션의 갱신 사항을 재수행하여 트랜잭션의 갱신이 지속성을 갖도록 해야 함
- 고장이 발생하기 전에 트랜잭션이 완료 명령을 수행하지 못했다면 원자성을 보장하기 위해서 이 트랜잭션이 데이터베이스에 반영했을 가능성이 있는 갱신 사항을 취소해야 함
- 회복의 기본원리 : 중복 (redundancy)
- 덤프 (dump) : 다른 저장장치로 복제 (archive)
- 로그(log, journal) : 데이터의 이전 값과 갱신 값을 별도의 파일에 기록
-
버퍼의 내용을 디스크에 기록하는 것을 가능하면 최대한 줄임으로써 성능을 향상시키는 것이 중요
출처
가톨릭대학교 데이터베이스설계 수업 자료
스프링 DB 1편 - 데이터 접근 핵심 원리
hjoon.log