데이터베이스(Database)의 트랜젝션(Transaction)의 개념과 뜻은 무엇인가? (Commit, Rollback)
뭐 자주 사용하시는 분들이야 잘 아시겠지만, 막 데이터베이스에 입문을 하셨거나, 실제 업무에서 별로 사용을 해보지 않은분들은 좀 헷갈려 하기도 하는 개념인데, 한번 저도 정리를 해봅니다.
일반적으로 작은 프로그램(스마트폰용 앱같은 경우나 유틸리티 프로그램)에서는 별로 사용하지 않는 개념이고, 보통은 업무용 프로그램에서 주로 많이 사용하는 방식인데, 일반 개발자보다는 전산실이나 SI쪽에서 일을 하시다보면 많이 접하게 되는 처리방식입니다.
우선 알아두셔야할 명령어가 commit, rollback인데, commit는 처리한 결과를 저장한다는 개념이고, rollback은 취소한다는 개념입니다(sql의 select, update, delete 등은 아시겠지요?)
가장 쉽게 비유를 하자면, 은행 ATM 인출기나 쇼핑몰 주문 등을 비유를 많이 하기도 하는데, 좀 더 쉽게 설명을 하자면 고스톱을 생각해보면 좋을듯 합니다.
5명이서 고스톱을 치는데, 우선 광을 팔면 광값을 주고, 첫뻑이 하면 돈을 주기도 하지요...
근데 문제없이 끝까지 진행이 되면 그 판은 끝나지만(Commit), 만약 패가 잘못돌려져서 나가리가 되는 경우 이전에 주었던 돈은 다시 원위치가 되는것(Rollback)과 같은 방식(물론 지역마다 규칙이 다를수도 있겠지만...)인데, 이런 경우 한판이 하나의 트렌졕션이 됩니다.
다른 예를 들자면 워드프로세서는 에디터 프로그램의 자동 저장 기능도 비슷한 트렌젝션이라고 할수 있습니다.
자동 저장 간격은 0으로 하면 변경하는 데로 그대로 저장을 합니다.(autocommit = true)
만약 자동 저장을 하지 않는다면 종료시에 파일을 저장하시겠습니까? 라고 묻는데, 이 경우 마지막에 저장한 이후에 메세지박스가 뜰때까지가 하나의 트랜젝션이라고 보시면 되고, Yes를 누르면 commit이고, No를 누르면 rollback이라고 보시면 됩니다.
보통 실무의 경우에서는 저같은 경우에 커서(cursor)방식으로 많이 사용을 했는데, 간단하게 급여계산을 한다고 친다면, 아래와 같은 로직으로 루틴을 돌리게 됩니다.(이건 client쪽에서 돌아가는 파워빌더(powerbuilder)인데, 좀 규모가 커지거나 속도가 좀 빨라야 한다면 database쪽에서 스토어프로시져로 돌립니다.)
급여 계산을 하면서 이 테이블, 저 테이블 등 여러곳을 건드리게 된다고 쳤을때, update, delete, insert를 실행하게 될텐데, 만약 update, delete, insert를 자동으로 db에 저장을 하게 된다면, 급여계산시에 오류가 있어서 중단을 하게 된다면, 다음번에 다시 오류를 수정해서 급여를 다시 돌리게 된다면 아까 update, insert , delete 를 한것이 중복되기 때문에 오류가 발생을 할수도 있는데, 이런 모든 처리를 하나의 큰 단위로 묶어서 처리를 하는게 트렌젝션이라고 보시면 됩니다.
// 이건 자동으로 저장하는 기능을 끄는데, 보통 기본값이 false
Sqlca.AutoCommit = False
// 커서 선언
DECLARE PCODE CURSOR FOR
SELECT "사원번호" FROM "직원테이블"
Open PCODE;
Do While True
Fetch PCODE Into :ll_사번
Choose Case Sqlca.SqlCode
Case 100
// 급여계산이 문제 없이 끝나는 경우 모든 과정을 저장
Commit Using Sqlca;
IF ag_code = 0 THEN
MessageBox("완료","급여 계산을 완료했습니다.",Information!)
Exit
Case -1
// 중간에 실패로 끝나는 경우에 모든 과정을 원래대로
Rollback Using Sqlca;
MessageBox("오류","급여 계산중 오류가 발생했습니다.",StopSign!)
End Choose
// 급여계산 루틴 시작
여기에서 select, update, delete, inset 등 급여계산 작업
// 급여계산 루틴 종료
Loop
Close PCODE;
// 간혹 어플이나 앱중에 보면 컬럼값을 변경을 했는데, 저장하겠냐는 질문없이 저장을 하는 경우를 위한 방식
Sqlca.AutoCommit = True
결과적으로 변경이 시작된후부터 최종 지점까지의 변경사항을 하나의 트렌젝션이라고 보시면 될듯합니다.
보통 계산을 한다거나, 집계를 하는 등 급여, 상여, 연말정산, 핸드폰 요금 계산, 은행, 보험료, 관리비, 가스, 전기요금 등의 계산 등 많은곳에서 사용이 됩니다.
간혹 위의 급여계산에서 오류가 나는지 안나는지를 테스트 하기 위해서 코딩을 해서 문제없이 끝날경우에 Commit Using Sqlca; 을 하지 않고, Rollback을 해서 시스템에 문제가 없는지 테스트용으로 활용을 할수도 있겠지요.
쓰다보니 좀 두서가 없기는 하지만, 고스톱 한판이라는 개념으로 파악을 해두시면 좋을듯 하고, 실전에서는 초보나 신입에게는 이쪽은 잘 시키지는 않는데, 업무용 개발을 하시다보면 꼭 거쳐야 할 관문이 아닐까 싶습니다.
KBS 시사기획 창 - IT 빅데이터(Big Data) 분석으로 세상을 바꾸다!?
구글, 페이스북 대형 IT업체들이 사용하는 데이터베이스(DataBase)는 무엇일까?
요즘은 빅데이터에 nosql등 관계형데이터베이스(RDB)가 조금은 홀대를 받는 생각이 들기도 하지만, 오라클(oracle), ms-sql, mysql, sqllite 등은 앞으로도 당분간은 건재하지 않을까 싶습니다.
학습을 원하신다면 일반 데이타베이스 개론책에서는 개념정도만 살짝 다루는 편인듯하고, 특정 언어에서 실무를 다루는 책을 보시면 공부하는데 좀 도움이 되지 않을까 싶습니다.
|
위와 같은 책도 괜찮기는 한데, 초급을 넘어 중급, 고급자용 책인데... 통신사의 요금계산을 저같은 하수처럼 커서를 사용하는것이 아니라, 하나의 sql로 처리를 하기도 하는데... 어느정도 실력이 되시면 위와 같은 책도 보시면 실력향상에 많은 도움이 되지 않을까 싶습니다.