트랜젝션에 대한 이야기 입니다. ^_^

트랜젝션에 대한 이야기는 많은 곳에서.. 이런 저런 이유로 들어 보셨을 겁니다.

프로그래밍을 하실때도 이 트랜젝션은 분명히 대단히 속도에 영향을 주는

요소 입니다.

특히나 데이터 수정이 있을 경우인 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)의 이해 문서의 끝입니다.





profile

부족하지만, SQLER의 누군가와 함께한 나눔을 통해 제가 더 많이 즐거웠습니다.
SQLER와 함께 즐거워 할수록, 그 나눔을 통해 더 많은 기회와 가치를 발견하게 되었습니다.
나눔의 생각이 앞으로도 계속, SQLER를 움직일 것입니다.

코난, 김대우 / SQLER 운영자 / 골라먹는 SQLER RSS 정보 구독 / 실시간 SQLER 소식 uxkorea 트위터