트랜젝션 - DataBase에서의 transaction 은 더이상 나눌 수 없는 하나의 논리적 작업단위를 말한다.
하나의 transaction은 단 한 줄의 SQL문이 들어갈 수도 있고, 몇페이지의 SQL 스크립트가 포함될 수도 있다.
하지만 어떤 경우라도 그 모든 일련의 작업은 하나로 취급된다.
transaction은 ACID 모델로 그 성격이 설명된다.
ACID란 Atomicity(원자성), Consistency(일관성), Isolation(격리성), Durability(영속성)
자세한 설명은 조금 있다 하길 하고 일단 가장 많은 예를 드는 은행업무를 예로 들어보자.
은행A에서 은행B로 온라인계좌이체를 하고자 한다. 해야할일은 아래와 같다.
1) 은행A에서 돈을 인출한다.
2) 은행B에 돈을 넣는다.
만약에 은행A에서 돈을 받고 은행B에 돈을 넣는과정에서 기계가 오류를 발생했다고 치자 그럼 돈은 어디에 있는가?
A에서는 돈이 이미 인출이 된 상태이기때문에 돈이 없을것이고 은행B에서는 입금하는 과정에서 오류가 발생했기 때문에 돈이 없다. 그렇다!! 이러한 상황을 하나의 작업으로 취급하는것이다.
은행A에서 돈을 인출하는것과 은행B에 돈을넣는 행위를 하나의 작업으로 보는 것이다.
즉 transaction내부에 포함된 작업내용을 분리해서 생각할 수 없음을 의미하는 것이다.
모두 실행되거나 모두 실행되지 않도록 하는 더이상 분리할 수 없는 하나의 작업인 것이다.
이것을 Atomicity(원자성)이라고 하는 것이다.
이런경우를 생각보자 은행B에는 200만원까지만 돈을 넣을수 있는데 현재 남은 잔고가 180만원이 있다고 생각해보자.
그리고는 은행A에서 50만원을 은행B에 입금을 한다고 생각했을때 은행B에는 200만원까지만 입금이 가능하므로 30만원은 어디론가 사라지고 없을 것이다. 이처럼 transaction이 완료된 후에는 항상 DataBase는 일관성있는상태 즉, 모든 무결성 제약조건을 만족시키는 상태가 되어야 한다는 의미이다. 모든 transaction이 정상적으로 수행될 수 있는 상태라 하더라도 결과가 무결성 제약조건에 만족하지 못할경우 해당 transaction은 취소되어야 한다는 것이다. 이것을 Consistency(일관성)이라고 한다.
또한 계좌이체가진행되고 있는상태 즉 은행A에서는 돈을 인출한 상태인데 아직 은행B에 들어가 있지 않은경우 누군가가 계좌조회를 시도할경우 생각한 금액이 조회가 되지 않을것이다.
좀더 쉽게 예를들자면 은행A에 100만원이 있었는데 은행B에 50만원만 이체를 한다고 생각해보자.
은행A에서는 50만원이 인출되었고 은행B에는 아직 입금이 안되었는데 누군가가 계좌조회를 시도한다면 은행A에는 50만원이 있는것으로 나올 것이고 은행B에는 이체된 금액이 없는 것으로 나올것이다.
이것처럼 연속적으로 진행되는 transaction 내부의 작업들이 수행되는 중간에 다른작업이 끼어들수 없음을 의미하는것을 Consistency(격리성) 이라고 한다.
transaction이 완료된 이후 즉 Commit tran 명령이 실행된 이후에는 그 결과를 다시 되돌릴 수 없음을 의미하는 Durability(영속성)이 있다.
이처럼 transaction이라고 말하고 그것을 사용할때에는 위에서 말한 4가지(Atomicity, Consitency Isolation, Durability) 개념이 모두 작동하게 된다는 것을 염두해 두어야 한다.
자 이제 transaction의 사용법을 알아보자.
transaction은 begin transaction(or begin tran)이라는 명령어로 시작을 하게 된다.
중요한 것은 begin transaction(or begin tran)명령을 넣었다고 해서 transaction이 실행되는 것은 아니라는것이다.
begin transaction(or begin tran) 명령은 단지 해당 명령어부터가 transaction의 시작이라고 표시를 해주는 것 뿐이다.
commit transaction(or commit tran) 명령은 성공적으로 수행된 모든 암시적 transaction, 명시적 transaction을 종료한다.
즉 commit 명령을 만나게 되면 해당 transaction의 변경내용이 최종 반연되고 리솟가 해제 되는 것이다.
만약 여러개의 중첩으로 되어있는 transaction 에서는 내부의 commit이 처리되었다고 해서 영구저장되거나 리소스가 해제되지 않는다. 최외곽(맨 처음 시작된) transaction이 commit되어야만 모든 transaction의 변경내용이 최종반영되고 리소스가 해제된다.
rollback transaction(or rollback tran)
transaction이 시작된 이후에 발생한 모든 변경사항을 취소하고 transaction이 사용하던 모든 리소스를 해제한다.
중첩된 transaction에서 rollback을 한 경우 모든내용이 취소되고 최외곽(맨 처음 시작된) transaction을 rollback시킨다.
select idx, name from member where idx = 5
begin tran
update member set name='조은혜' where idx = 5
select idx, name from member where idx = 5
rollback tran
select idx, name from member where idx = 5
댓글 영역