트랜잭션은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미한다.
예시) 사용자 A가 사용자 B에게 만원을 송금한다
1. 사용자 A의 계좌에서 만원을 차감한다: UPDATE를 통해 사용자 A의 잔고 변경
2. 사용자 B의 계좌에 만원을 추가한다: UPDATE를 통해 사용자 B의 잔고 변경
작업 단위: 출금 UPDATE + 입금 UPDATE
=> 통틀어 하나의 트랜잭션이라고 한다.
- 위 두 쿼리문이 모두 성공적으로 완료되어야만 하나의 작업 완료
savePoint는 트랜잭션 내부에서 사용자가 지정할 수 있는 세부 작업 단위라고 생각할 수 있다. 특정 지점에 savePoint를 설정한 후 Rollback to savePoint1
을 통해 해당 지점으로 롤백을 할 수 있다. 기억해야할 점은 아래 그림에서 SP1으로 롤백을 한 뒤에는 미래 시점인 SP2의 savePoint는 삭제된다는 것이다.
트랜잭션이 실행 중인 상태
트랜잭션 실행에 오류가 발생하여 중단된 상태
트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태
트랜잭션의 마지막 연산까지 실행하고 Commit 연산이 실행되기 직전의 상태
트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태
부분완료 vs 완료
commit 요청이 들어오면 상태는 부분 완료 상태가 된다. 이후 commit을 문제 없이 수행할 수 있다면 완료 상태로 전이되고, 만약 오류가 발생하면 실패 상태가 된다. 즉 부분완료는 commit 요청이 들어왔을 때를 의미하고, 완료 상태는 commit을 정상적으로 완료한 상태를 의미한다.
트랜잭션은 꼭 필요한 최소의 코드에만 적용하는 것이 좋다.
여러 개의 트랜잭션으로 쪼개서 트랜잭션의 범위를 최소화하라는 의미다.
일반적으로 데이터베이스 커넥션의 개수가 제한적이다. 그런데 각 단위 프로그램이 커넥션을 소유하는 시간이 길어지면 사용 가능한 여유 커넥션의 개수는 줄어들게 된다. 이러면 각 단위 프로그램에서 커넥션을 가져가기 위해 기다려야 하는 상황이 발생할 수도 있기 때문이다.
데이터베이스 커넥션이란 애플리케이션과 데이터베이스를 연결을 뜻하는 것으로, 애플리케이션에서 데이터베이스에 접속하고 접속을 종료하는 일련의 과정을 의미한다.
이를 이해하기 위해서는 DBMS의 구조와 Buffer 관리 정책에 대한 이해가 필요하다.
하지만 저는 이해를 못했습니다..
데이터베이스 시스템은 보통 비휘발성 저장 장치인 디스크에 데이터를 저장하며 전체 데이터베이스의 일부분을 메인 메모리에 유지한다. DBMS는 데이터를 고정 길이의 페이지로 저장하며, 디스크에서 읽거나 쓸 때에 페이지 단위로 입출력이 이루어진다.
DBMS는 각 제품마다 구조가 다르기는 하지만, 크게 질의 처리기(Query Processor)와 저장 시스템(Storage System)으로 나눌 수 있다.
MYSQL의 경우에는 InnoDB, MyISAM 등과 같이 여러 하부 저장 시스템을 선택할 수 있는데, 이와 같은 모델은 상부의 질의 처리기와 하부의 저장 시스템 간의 명확하게 구분되는 계층 구조에 해당한다.
CUBRID 역시 질의 처리기와 저장 시스템 두 개의 구성 요소로 이루어져 있으며, 질의 처리기와 저장 시스템이 좀 더 밀접하게 연결되어 있다.
메인 메모리에 유지하는 페이지들을 관리하는 모듈
버퍼 관리 정책이 트랜잭션 관리에 매우 중요한 결정을 가져온다. 버퍼 관리 정책에 따라서 트랜잭션의 UNDO 복구와 REDO 복구가 요구되거나 그렇지 않게 된다.
오퍼레이션 수행 중에 수정된 페이지들이 버퍼 관리자의 버퍼 교체 알고리즘에 따라서 디스크에 출력될 수 있다. 버퍼 교체는 전적으로 버퍼의 상태에 따라서 결정되며, 일관성 관점으로 봤을 때는 임의의 방식으로 일어나게 된다. 즉 아직 완료되지 않은 트랜잭션이 수행한 페이지들도 디스크에 출력이 될 수 있으므로, 만약 해당 트랜잭션이 어떤 이유든 정상적으로 종료될 수 없게 되면 트랜잭션이 변경한 페이지들은 원상 복구 되어야 한다. 이러한 복구를 UNDO라고 한다.
만약 버퍼 관리자가 트랜잭션 종료 전에는 어떤 경우에도 수정된 페이지들을 디스크에 쓰지 않는다면, UNDO 오퍼레이션은 메모리 버퍼에 대해서만 이루어지면 되는 식으로 매우 간단해질 수 있다. 이 정책은 매우 큰 크리의 메모리 버퍼가 필요하다는 문제점을 가지고 있다.
커밋한 트랜잭션의 수정은 어떤 경우에도 유지되어야 한다. 이미 커밋한 트랜잭션의 수정을 재반영하는 복구 작업을 REDO 복구라고 하는데, REDO 복구 역시 UNDO 복구와 마찬가지로 버퍼 관리 정책에 영향을 받는다.
참고
[DB기초] 트랜잭션이란 무엇인가?
DB 트랜잭션(Transaction)
[DB] 트랜잭션(Transaction)이란? | ACID
[Database] 트랜잭션이란?