트랜잭션이란? 논리적인 작업단위를 구성하는 연산들의 집합
트랜잭션을 정의하는 것은 전적으로 개발자 의무! 정의된 트랜잭션들에 대해 문제가 발생하지 못하게 방지하는 것은 DBMS의 몫
트랜잭션이 지켜야 할 조건 : ACID 특성
- 원자성 (Atomicity) : 트랜잭션이 시작되면 트랜잭션에서 정의된 연산들은 모두 성공적으로 실행되던지, 아니면 실행 전 상태로 되돌아가야함 ‘all or nothing’ 중간에 실패할 거 같으면 실행 전으로 돌아가야함!
- 일관성 (Consistency) : 트랜잭션이 시작되기 전에 데이터베이스 내용이 일관된 상태라면 트랜잭션이 종료된 후에도 데이터베이스의 내용이 일관된 상태로 유지돼야함 (예-출금 후에도 두 계좌 잔액 동일)
*일관된 상태라는 건 어떻게 판단? DBMS 자체에서는 데이터베이스가 일관된 상태라는걸 인지할 수 없고, 전적으로 사용자가 판단해야함.
- 고립성 (Isolation) : 트랜잭션이 실행하는 과정에서 갱신한 데이터는 트랜잭션이 완료될 때 까지 다른 트랜잭션이 참조 불가
*고립성 만족하는지 확인하는 방법 : 동시에 실행하는 트랜잭션들의 실행 결과가 순차적으로 실행된 결과 와 동일한지 확인
- 지속성 (Durability) : 트랜잭션이 성공적으로 완료되고 이 사실이 사용자에 통지된 이후엔 시스템 장애가 발생하더라도 그 결과는 손실되지 않고 영구적으로 남아있어야 함. 무효화 될 수 X . 트랜잭션이 완료되면 주기억장치가 아닌 디스크 같은 보조기억장치에 저장되거나 그렇지 않더라도, 시스템 장애가 회복되고 난 후 어떤 형태로든 그 데이터 복구할 수 있어야함
(예 : 현금 인출 완료되고 고객에게 지급된 후 무효화 할 수 없음)
트랜잭션의 상태
- 동작 : 트랜잭션이 시작되고 연산들이 정상적으로 실행 중인 상태
- 부분완료 : 트랜잭션에 정의된 모든 연산의 실행이 끝난 상태
- 완료 : 트랜잭션이 성공적으로 종료된 상태
- 실패 : 트랜잭션이 완료되지 못하고 더 이상 실행되지 못하는 상태 (트랜잭션이 정상적인 종료 불가)
- 중단 : 트랜잭션 실패 후 실패 전으로 복귀된 상태
모든 연산이 성공적으로 실행되면 부분완료 상태로 진입하는데, 이 상태는 아직 완료 상태가 아님. 모든 연산들이 성공적으로 실행됐다해도 그 결과가 바로 디스크에 영구적으로 저장되는 건 아니기 때문!
트랜잭션의 결과가 영구적으로 보존될 수 있다는게 보장되면 최종적으로 ‘완료’ 상태에 도달
트랜잭션이 완료 상태에 도달하면 ‘지속성 특성’에 의해 취소는 불가능. 이후의 시스템 장애에 대해서도 완료된 트랜잭션의 실행 결과에 대한 복구 가능. 단, 복구가 가능하다는건 트랜잭션이 완료됐을 때 아직 디스크에 저장이 되지않았다 해도 이 후에 그 결과를 디스크에 반영할 수 있다는 것이지, 디스크의 물리저 파손에 대해서도 복구가 가능한 건 아님!
실패 상태에 도달하면, 트랜잭션이 정상적인 종료를 못 하는 것이고, 그러면 트랜잭션의 원자성 조건에 의해 지금껏 실행한 연산들을 무효화해 실행 전의 상태로 되돌려 놔야함 (=복귀)
복귀가 이뤄지면 이 트랜잭션은 최종적으로 ‘중단’ 상태에 도달함. 중단 상태에 도달한 트랜잭션은 상황에 따라 다시 시작할 수도, 더 이상 실행되지 않고 완전히 종료될 수도 있음
=> 트랜잭션이 완료되거나 중단됐을 때 공통적으로 ‘종료’ 됐다고 함!
다중 프로그래밍 개념 이용하는 다중사용자 DBMS는 한 트랜잭션이 완전히 끝나지 않은 상태에서 다른 트랜잭션이 수행될 수 있음. 이 때 동시에 실행되는 트랜잭션들이 서로 간의 간섭으로 인해 일관성이 파괴될 수 있음 => 트랜잭션의 실행 순서를 제어할 필요 있음 => ‘동시성 제어’
read(x) : 이름이 x인 데이터베이스 항목을 트랜잭션의 지역변수 x로 읽어들임 (예 – select문)
* read연산이 끝나야만 그 트랜잭션이 다른 연산 할 수 있음!
write(x) : 지역변수 x에 저자된 값을 데이터베이스 항목 x에 저장 (예 – update문)
* write(x)연산을 수행했을 때 그 결과가 디스크에 즉시 저장될 수도, 그렇지 않을 수도 있다. 대부분의 DBMS는 주기억장치에 ‘버퍼’를 두고 디스크에 저장해야 할 데이터들을 일시적으로 보관했다가 나중에 블록 단위로 기록한다.