SQL2000 강좌
트랜젝션에 대한 이야기 입니다. ^_^
트랜젝션에 대한 이야기는 많은 곳에서.. 이런 저런 이유로 들어 보셨을 겁니다.
프로그래밍을 하실때도 이 트랜젝션은 분명히 대단히 속도에 영향을 주는
요소 입니다.
특히나 데이터 수정이 있을 경우인 Insert, Update, Delete를 잘못 수행했을 경우
대단히 많은 문제를 줄 수 있으며.. - CPU등의 시스템은 펑펑 놀고 있는데..
SELECT의 조회 속도가 대단히 느려지는 사태가 발생하는 겁니다.
이럴때는 한번쯤 트랜젝션 처리 모듈의 문제를 어플리케이션에서 점검을 해 보셔야
하지요. - 물론 마지막쯔~음에.. 문제상황인 블러킹이나 데드락을 막는 방법과..
어플리케이션을 개발하실때.. 주의에 주의를 거듭하셔야 하는 부분도
살짝 언급을 해 드릴겁니다.
이 장의 이름은 트랜젝션과 잠금처리인데요..
트랜젝션은 뭘까요? ^_^
늘 그랬던 것처럼.. 군더더기 없이 깔끔하게 알아 보도록 하지요.
트랜젝션은 작업의 단위를 지정해 주는 중요한 부분이기 때문입니다.
또한 트랜젝션은 SQL구문이나 쿼리를 실제로 처리할 경우의 가장 작은 단위 입니다.!!
은행이야기를 조금 해 볼까요?
코난이 계좌에 200원이 있고.... 수선이 계좌에 300원이 있다...
짤짤이에서 진 코난이가 100원을 수선이에게 잃어 200원중 100원을 온라인으로 계좌이체
를 시켜줘야 한다....
은행에사거 온라인으로 입금을 하기위해
|
1. 코난이 통장에서 100원을 뺌 - 코난이 통장 = 100원 수선이 통장 = 200원 2. 수선이 통장에 100원을 더함 - 코난이 통장 = 100원 수선이 통장 = 300원
|
하려고 했다...
그런데 웬일.. 정전이 나서... 1번 작업을 끝마치니 시스템이 죽었다...
"대우네 은행"에서 그당시 온라인으로 계좌 이체를 시킨 사람이 1000명이었다...
그 999명과 코난이는(도합 1000명) 이 문제를 어케할 것인가?
-_-;; 아마 기억하시는분들은.. MSSQL7 중급강좌의 트랜젝션 부분을 역시나..
손가락 두개로 컷 & 페이스트 한걸 아실 겁니다. -_-;;
양해하시고.. 저런 문제가 발생할 수 있지요.. !!!
저 내용을 우리가 사용하는 구문으로 살짝 돌려 본다면 이런 이야기가 될지 모릅니다.
|
update 계좌 set 금액 = 금액 - 100 where id like '코난' update 계좌 set 금액 = 금액 + 100 where id like '수선'
|
하지만 위의 쿼리가 아닙니다!!!!!
SQL서버에서 위와 같은 처리를 위해서는 위처럼 쓰시면 안됩니다.
위와 같은 구문으로 쓰시면?
위의 쿼리는 다음과 같이 변환 됩니다.
|
begin tran update 계좌 set 금액 = 금액 - 100 where id like '코난' commit tran
begin tran update 계좌 set 금액 = 금액 + 100 where id like '수선' commit tran
|
이렇게 변화하게 됩니다. - 내부적으로 SQL서버의 엔진이 저렇게 바꾸는 겁니다.
그렇다면!!! 어떻게 해야.. 하나의 단위로.. 위 두개의 작업을 하나로 묶어서 수행하게
할 수 있을까요?
바로 다음과 같이 명시적으로 begin tran과 commit tran을 사용하시면 됩니다.
|
begin tran update 계좌 set 금액 = 금액 - 100 where id like '코난' update 계좌 set 금액 = 금액 + 100 where id like '수선' commit tran
|
이렇게 사용하시면 두개의 작업이 하나의 단위로 처리가 되게 되지요.
별로 어렵지 않으실 겁니다. 그리고 이정도는 컴쪽의 일을 하신다면 한번쯔음~~
들어 보셨을 이야기일 거구요. 그럼 조금 다른 이야기로.. 내용을 돌려 보도록 하지요.
트랜젝션의 네가지 성격
트랜젝션은 DBMS차원에서.. 다음 네가지 성격을 만족해야만 합니다.
1. 원자성(atomicity) : 트랜젝션은 전부, 전무의 실행만이 있지.. 일부 실행으로
트랜젝션의 기능을 가질 수는 없다.
2. 일관성(consistency) : 트랜젝션이 그 실행을 성공적으로 완료하면 언제나 일관된
데이터베이스 상태로 된다라는 의미입니다.. 즉, 이 트랜젝션의 실행으로 일관성이
깨지지 않는다 라는 의미 이지요...
3. 격리성(isolation) : 연산의 중간결과에 다른 트랜젝션이나 작업이 접근할 수 없다..
라는 의미입니다.
4. 영속성(durability) : 트랜젝션의 일단 그 실행을 성공적으로 끝내면 그 결과를 어떠한
경우에라도 보장받는다.. 라는 의미입니다....
그렇다면 도대체~~ 저 어려운 단어들의 나열이 트랜젝션의 성격이라는 것은 알겠는데..
그 트랜젝션 이라는 녀석으로 과연 어떻게 문제가 생겼을때 데이터를 복구하냐??
이때는 UNDO와 REDO의 이야기가 나오게 됩니다.
우선 많이들 이야기 하시는 이야기로 알아 보지요.
장애(failure)와 회복(recovery)
회복(recovery)이란 장애(failure)가 일어났을 때 데이터 베이스를 장애 이전의 상태로
다시 복구 시켜 일관된 상태로(consistent state)로 복구 시키는 작업이지요
당연하지요? -_-;;
장애를 조금더 알아본다면? 관리자가 구두로 컴퓨터 파워 버튼을 실수로 차버리거나.
해서 문제가 생기는 상황?? 이렇게 대충은 생각이 가능하실 겁니다.
조금만 더 세분화를 시켜 본다면..
|
1. 트랜젝션 장애 : 트랜젝션 내의 논리적 오류나 내부조건, 입력 데이터의 불량, 데이터의 불명, 시스템 자원의 과다한 사용요구 등으로 정상적인 실행을 계속 할 수 없는 상태를 의미 합니다. 2. 시스템 장애 : 이는 하드웨어의 오동작으로 메인 메모리에 있는 정보의 손실이나 교착 상태가 발생하여 더 이상 실행을 계속할 수 없는 상태를 의미 하지요... 3. 미디어 장애 : 디스크 헤드 붕괴나 고장으로 인하야... 저장 장치의 데이터베이스 일부 또는 전부가 손상된 상태를 의미하구요 ^_^
|
이렇게 세분화가 가능해 집니다.
그렇다면 회복이라는 것은?
말 그대로 데이터를 안정된 상태로 복구 시키는 것을 의미하지요.
위에서 말씀드린. UNDO와 REDO를 이용하는 방법에 대해서는... 뒤에서 보실 체크포인트
프로세스와 함께 이루어지는 부분을 주로 이야기 드릴 겁니다.
조금만 더 기다려 주시구요.
그리고 이 강좌를 SQL7중급강좌에서는 이론적인 이야기를 주로 했었는데요..
제가 쓰고나서도 재미 대단히 없더군요.. 천천히 재미나는 예제로 풀어 나갈테니..
기대해 주시고.. 다음 강좌인 트렌젝션의 종류 부분을 보도록 하시지요.
11. 트랜젝션과 잠금처리 - 1. 트랜젝션(Transaction)의 이해 문서의 끝입니다.

부족하지만, SQLER의 누군가와 함께한 나눔을 통해 제가 더 많이 즐거웠습니다.
SQLER와 함께 즐거워 할수록, 그 나눔을 통해 더 많은 기회와 가치를 발견하게 되었습니다.
나눔의 생각이 앞으로도 계속, SQLER를 움직일 것입니다.
코난, 김대우 / SQLER 운영자 / 골라먹는 SQLER RSS 정보 구독 / 실시간 SQLER 소식 uxkorea 트위터

코난