트랜잭션이란 무엇인가?
데이터베이스 관리 시스템에서 사용자 프로그램의 실행 단위
데이터베이스 시스템에서 병행 제어 및 회복 작업 시 처리되는 작업의 논리적 단위
사용자가 시스템에 대한 서비스 요구 시 시스템이 응답하기 위한 상태 변환 과정의 작업 단위
관련 작업을 모두 완벽하게 처리하거나, 처리하지 못하는 경우 원 상태로 복구해서 작업의 일부만 적용되는 현상이 발생하지 않게 만들어주는 기능으로 작업의 완전성을 보장한다.
데이터베이스 관리 시스템에 요구되는 동시 접근 제어와 복구에 관련된 문제를 해결하기 위해서 데이터베이스 관리 시스템은 트랜잭션을 구현해야 한다.
트랜잭션은 ACID라고 불리는 다음의 성질을 만족해야 한다
트랜잭션의 특징
원자성
관련 작업이 전부 처리되거나 아예 처리되지 않아야 함.
중간에 취소하면 앞에서 했던 모든 작업들이 취소돼야 함.
트랜잭션과 관련된 작업들이 부분적으로 실행되다가 중단되지 않는 것을 보장하는 능력.
계좌 이체를 예를 들면, 원래 계좌에서 돈을 출금하여 입금 계좌로 돈을 입금하는 과정에서 한쪽의 작업만 성공하거나 실패해서는 안되고, 성공하려면 모두 성공하거나 실패하려면 모두 실패해야 한다.
중간 단계까지 실행되고 도중에 실패하는 일이 없도록 보장되는 성질
일관성
트랜잭션 이전과 이후에 데이터베이스의 상태는 이전과 같이 유효해야 함.
트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터 베이스 상태로 유지하는 것을 의미한다.
>> 트랜잭션이 일어난 이후의 데이터베이스는 데이터베이스의 제약이나 규칙을 만족해야 한다는 뜻.
모든 고객은 반드시 이름을 가지고 있어야 한다는 제약이 있을 때,
이름 없는 새로운 고객을 추가하거나
기존 고객의 이름을 삭제하면 일관성을 위반하게 된다.
예를 들어, 사용자 ID가 반드시 존재해야 한다는 규칙이 데이터베이스에 존재한다면 모든 트랜잭션은 이를 준수해야 하며, 이 경우 ID를 삭제하거나 Null로 만드는 트랜잭션을 실행할 수 없다.
>> 일관성을 위해 조건을 사용
고립성
모든 트랜잭션은 다른 트랜잭션들로부터 독립되어 동작해야 함
여러 개의 트랜잭션이 수행될 때, 각 트랜잭션은 고립되어 있어 연속으로 실행된 것과 동일한 결과를 나타낸다.
이는 트랜잭션 밖에 있는 어떤 연산도 중간 단계의 데이터를 볼 수 없음을 의미한다.
>> 고립성을 위해 잠금 규약을 사용
지속성
트랜잭션이 성공적으로 수행되었다면 완료의 효과는 지속돼야 함.
성공적으로 수행된 완료의 효과는 영구적이어야 한다는 것을 의미한다.
시스템에 오류가 발생하거나 일관성 검증을 수행하더라도 성공적으로 수행된 트랜잭션은 데이터베이스에 적용되어야 함을 의미한다.
하나의 트랜잭션이 성공적으로 수행되었다면, 해당 트랜잭션에 대한 로그가 남아야 하는 성질을 말한다.
모든 트랜잭션은 로그로 남고 시스템 장애 발생 전 상태로 되돌릴 수 있어야 하며, 트랜잭션은 로그에 저장된 후 commit 상태로 간주되어야 함
예를 들어 은행에서 계좌 이체를 성공적으로 실행한 뒤에, 해당 은행 데이터베이스에 오류가 발생해 종료되더라도 계좌이체 내역은 기록으로 남아야 한다.
마찬가지로 계좌이체를 로그로 기록하기 전에 시스템 오류 등에 의해 종료 된다면, 해당 이체 내역은 실패로 돌아가고 각 계좌들은 계좌이체 이전 상태로 돌아가게 된다.
>> 원자성과 지속성을 위해 데이터베이스 로그(log)와 로그 우선 기록(Write Log Ahead)를 사용
트랜잭션과 Lock
잠금(lock)과 트랜잭션은 비슷한 듯 다른 개념
잠금은 동시성을 제어하기 위한 기능
>>여러 커넥션에서 동시에 동일한 자원을 요청할 경우, 순서대로 한 시점에 하나의 커센셕만 사용할 수 있게 해주는 역할. (자원은 레코드나 테이블을 의미한다)
트랜잭션은 데이터의 값이 서로 일치하는 상태를 보장하기 위한 기능
동일한 자원에 접근하는 것과는 관계 없이, 몇개의 쿼리를 날리던 논리적인 작업 셋 자체가 100% 적용되거나 아무것도 적용되지 않아야 함을 보장하는 것
트랜잭션의 상태


5
활동 (Active): 트랜잭션이 실행 중인 상태
실패 (Failed): 트랜잭션 실행에 오류가 발생하여 중단된 상태
부분 완료 (Partially Committed): 트랜잭션의 마지막 연산까지 실행했지만, Commit 연산이 실행되기 직전의 상태
완료 (Committed): 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태
철회 (Aborted): 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태
트랜잭션 연산
Commit
하나의 트랜잭션에 대한 작업이 성공적으로 끝나서 데이터베이스가 다시 일관된 상태에 있을 때, 연산이 성공적으로 완료된 것을 트랜잭션 관리자에게 알려주는 연산
Rollback
하나의 트랜잭션 처리가 비정상적으로 종료되어 데이터베이스의 일관성이 깨졌을 때, 다시 원자성을 구현하기 위해 해당 트랜잭션이 행한 모든 연산을 취소(Undo)하는 연산. 해당 트랜잭션을 재시작하거나 폐기한다.
트랜잭션을 사용할 때 주의할 점
1. 트랜잭션이 필요한 기능 범위에만 최소한으로 적용한다. 트랜잭션의 범위를 최소화하라.
>> 일반적으로 데이터베이스 커넥션은 개수가 제한적이다. 그런데 각 단위 프로그램이 커넥션을 소유하는 시간이 길어진다면 사용 가능한 여유 커넥션의 개수는 줄어들게 된다.
2. 메일 전송, 파일 전송, 네트워크 통신과 같은 외부 자원과의 연결 작업은 제거해야 한다.
>> 외부 자원 연결때문에 트랜잭션 내의 전체 작업이 취소될 수 있다