데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위, 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미
트랜잭션에는 여러 개의 연산이 수행될 수 있고, 수행 중에 한 작업이라도 실패하면 전부를 rollback
하고 모두 성공해야 commit
한다.
Commit 연산
: 한개의 논리적 단위(트랜잭션)에 대한 작업이 성공적으로 끝났고 데이터베이스가 다시일관된 상태
에 있을 때, 이 트랜잭션이 행한 갱신 연산이 완료된 것을 트랜잭션 관리자에게 알려주는 연산
Rollback 연산
: Rollback 연산은 하나의 트랜잭션 처리가 비정상적으로 종료되어 데이터베이스의일관성을 깨뜨렸을 때
, 이 트랜잭션의 일부가 정상적으로 처리되었더라도 트랜잭션의 원자성을 구현하기 위해 이 트랜잭션이 행한 모든 연산을 취소(Undo)하는 연산
아래 사진은 하나의 트랜잭션을 나타낸다.
완전성 (Integrity)를 유지
하기 위해(데이터 부정합을 방지
하기 위해)
- 데이터 부정합의 예시
DB 서버에 여러 개의 클라이언트가 동시에 접근하거나 응용프로그램이 갱신을 처리하는 과정에서 중단되는 경우- 데이터 부정합을 막기 위해서 프로세스를 병렬로 처리하지 않도록 해야하지만 이는 효율이 매우 떨어진다
👉 프로세스를 병렬로 처리할 수 밖에 없는 현실적 상황에서 데이터 부정합을 방지하기 위해 트랜잭션을 사용하는 것이다.
데이터베이스 트랜잭션은 ACID라는 특성을 가지고 있다.
ACID는 데이터베이스 내에서 일어나는 하나의 트랜잭션(transaction)의 안전성을 보장하기 위해 필요한 성질이다.
ACID는 주식거래, 금융업에서 중점적으로 사용된다.
=> 주식거래, 금융업에서는 관계형 데이터베이스를 이용한다.
관계형 데이터베이스를 사용하면 데이터베이스와 상호 작용하는 방식을 정확하게 규정할 수 있기 때문에,
데이터베이스에서 데이터를 처리할 때 발생할 수 있는 예외적인 상황을 줄이고, 데이터베이스의 무결성을 보호할 수 있다.
모두 성공하거나, 반대로 전부 실패
되는 성질이전에 commit된 상태를 임시 영역에 따로 저장
함으로써 보장한다. 다시말해, 현재 수행하고 있는 트랜잭션에서 오류가 발생하면 현재 내역을 날리고 임시 영역에 저장했던 상태로 rollback
한다.이전 데이터들이 임시로 저장된 영역을
Rollback Segment
라고 한다.
👉트랜잭션의 원자성은 Rollback Segment에 의해 보장
된다.
현재 수행하고 있는 트랜잭션에 의해 새롭게 변경되는 내역을Database Table
이라고 한다.
질의 수행
savepoint A
질의 수행
rollback to A
트랜잭션의 길이가 길어지면 확실하게 오류가 발생하지 않은 부분도 처음부터 다시 작업을 수행해햐되는 비효율성 문제가 생긴다. 따라서 확실한 부분에 대해서는 rollback이 되지 않도록 Save Point (중간 저장 지점)을 지정한다.
Save Point를 지정하면 rollback할 때 지정된 save point 이후부터 진행하게 된다.
계좌이체를 할 때에는 다음과 같은 두 단계가 있다.
1. A 계좌에서 출금한다.
2. B 계좌에 입금한다.
계좌이체를 하려는데 A 계좌에서는 출금이 이뤄지고, B 계좌에 입금되지 않았다고 가정한다.
어디서 문제가 발생했는지 파악할 수 없다면, A 계좌에서 출금된 돈은 세상에서 사라지는 돈이 된다.
만약 은행에서 이런 일이 발생한다면, 은행은 더이상 제 기능을 할 수 없을 것이다다.
A 계좌에서 출금하는 일에 성공했지만, B 계좌에 입금하는 작업에 실패한다면 계좌 A에서 출금하는 작업을 포함하여 모든 작업이 실패로 돌아가야 한다는 것 Atomicity(원자성)이다.
원자성을 지켰다면 1번과 2번, 두 작업이 모두 성공적으로 완료되어야 한다.
그렇지 않으면(둘 중 하나의 작업이라도 실패한다면), 하나의 단위로 묶여있는 모든 작업이 실패하게 만들어 기존 데이터를 보호한다. (롤백 시킨다.)
모든 제약 조건(기본키, 외래키, 도메인, 도메인 제약조건 등)을 만족
하는 것을 통해 보장.각각 일관성이 보장되는 서로 다른 상태
가 된다.명시적인 무결성 제약 조건
들뿐만 아니라, 자금 이체 예에서 두 계좌 잔고의 합은 이체 전후가 같아야 한다는 사항과 같은 비명시적인 일관성 조건
들도 있다.
- 테이블B의 기본키 (b_id) 가 테이블A의 외래키 (b_id) 로 존재할 경우, b_id에 대한 제약조건이 테이블B에서 변경되면 b_id를 외래키로 가지는 테이블A에서도 변경되어야 한다.
- 이벤트와 조건이 발생할 떄 트리거 (Trigger)를 통해 트랜잭션 일관성을 보장한다.
각각의 트랜잭션은 다른 트랜잭션의 수행에 영향을 받지 않고 독립적
으로 수행되어야 한다. 기록은 영구적
이어야 한다는 뜻이다.비휘발성 저장소에 기록
됐다는 뜻이다.즉, 정상적으로 완료 혹은 부분완료된 데이터는 DBMS가 책임지고 데이터베이스에 기록하는 성질을 트랜잭션의 Durability(영속성)이라고 함.
트랜잭션은 아래 세 가지 중 하나의 형태로 종료된다.
문제 없이 정상적으로 수행된 경우에는 커밋을 통해 종료
잘못된 입력이 주어졌거나 일관성 제약 조건을 위배한다거나 하는 상황이 발생되거나 사용자의 요청에 의해 철회 되는 경우
타임 아웃이나 교착상태 등과 같이 시스템이 감지하는 문제로 인하여 DBMS가 철회하는 경우
이 외에도 트랜잭션은 각종 시스템 고장으로 인해 영향을 받을 수 있으며, DBMS는 이와 같은 상황에서 트랜잭션을 관리해야한다.
참고