본문 바로가기
데이타베이스

트랜잭션 개념과 mysql에서의 적용

by 세이박스 2008. 10. 10.
반응형
출처: 네이버, phpschool

은행 현금인출기(ATM)에서 돈을 인출하는 과정을 생각해 봅시다.

현금인출을 하겠다고 기계에게 알려준뒤 현금카드를 넣어서 본인임을 인증받고,
인출할 금액을 선택하면 ATM 기는 돈을 내어줍니다.

이러한 거래에 있어서 지켜져야 할 중요한 것이 있습니다.
기계의 오동작 등으로 인하여 전산상으로는 돈을 인출한 것으로 입력이 되었는데 돈은 안나온다거나,
돈은 나왔는데 일련의 에러나 문제로 인하여서 돈을 인출한 것이 전산상으로 입력이 안되면
상당히 심각한 문제가 발생하겠죠.

때문에 전산상으로도 입력이 정상적으로 잘 되고, 돈도 인출이 정상적으로 잘 됨을 확인하고 나서야,
인출하는 하나의 과정이 정상적으로 처리되었음을 확인할 수 있습니다.
여기서 돈을 인출하는 일련의 과정이 하나의 묶음으로 처리되어야 함을 이해하실 수 있을것입니다.
그리고 혹시 처리도중 중간에 무슨 문제가 발생한다면 진행되던 인출과정 전체를 취소하고
다시 처음부터 시작하도록 해야 될 것입니다.

이것을 트랜잭션이라고 합니다.
transaction 의 사전적의미와도 상통합니다만, 거래함에 있어서 거래하는 양측이 다 원하는
결과물을 얻어야만 정상적으로 처리되는 것이고 그렇지 않다라면 거래자체가 무산되어 원점으로
되돌려져(roll back) 버리는 것이죠.
전산적으로나 데이터베이스에 있어서도 이처럼 하나의 묶음으로 처리가 이루어져야 하는 모든것에
트랜젝션이란 개념이 사용됩니다.

롤백(roll back) 이란 것은 트랜잭션으로 인한 하나의 묶음처리가 시작되기 이전의 상태로
되돌려지는 것을 말합니다.

커밋(commit) 이란 것은 정상적으로 처리되어서 확정(실행을 위해서 엔터키를 치는 것처럼) 한다는
것이구요. 커밋하면 트랜잭션의 처리과정이 모두 반영되며 하나의 트랜잭션 과정이 끝나게 됩니다.

트랜잭션, 롤백... 이러한 단어들은 모든 처리가 정상적으로만 이루어진다고 한다면 필요없는
것이겠죠. 그러나 항상 예외나 에러는 발생하는 것이며, 이러한 것이 발생할 때에 적절한 처리를
위해서 존재하는 것입니다.

-----------------------------------------------------------------------------------

트랙젝션의 전체 프로시져를 살펴보면,

Begin Transaction - (작업) - if(작업완료) -> Commit
else(작업실패) -> Roll Back


그러니까, 모든 작업이 성공한 경우 Commit 을 해주고, 중간에 조금이라도 실수가 있었다면 Roll Back 을 하게 됩니다. 롤백을 하면 Begin Transaction 을 하기전까지의 상태로 돌릴 수가 있습니다.

Commit 은 Begin Transaction 부터 지금까지의 작업 완료하게 되고, Commit 을 해야만 비로소 DB 가 업데이트 되는겁니다.

--------------------------------------------------------------------------------------

innodb로 테이블을 작성할 수 있는지 없는지를 먼저 확인하세요.
mysql에 접속해서 show varibles;라는 명령을 치면 설정들이 흘러 내립니다..-_-;
그 중에 have_innodb라는 옵션을 찾고 설정이 disabled라고 되어있으면 죽어도 innodb를 사용할 수 없습니다. 아무리 mysql버전이 높아도 말이죠..
have_innodb를 yes로 설정을 바꾸려면 my.ini 파일에서..
[mysqld]
innodb_data_file_path = ibdata1:10M:autoextend
set-variable = innodb_buffer_pool_size=70M
set-variable = innodb_additional_mem_pool_size=10M
set-variable = innodb_log_file_size=20M
set-variable = innodb_log_buffer_size=8M
innodb_flush_log_at_trx_commit=1
저장할 파일명과 크기, 버퍼 크기, 로그 파일 크기 등이 나와 있니다. 원하는 크기로 설정, 저장을 하고 mysql을 재시작하면 됩니다.

트랜젝션 설정은 간단합니다. (Win32 + Mysql)
Mysql 4.x 를 설치하시구 테이블 타입을 type=innodb 으로 만드시고
mysqld-max-nt --bdb-home=c:\temp
이와 같이 실행시키면 됩니다.
글구 php 소스 상에서
mysql_query("BEGIN"); <-- 소스 맨위에 넣기 (트랜잭션 시작)
글구 쿼리 처리를 하다가
각각의 쿼리를 체크해서 오류가 생기면
mysql_query("ROLLBACK");
모든 쿼리의 오류가 없으면
mysql_query(COMMIT");
쿼리에 대한 오류체크는 한번 생각해보세요.
제가 이렇게 사용하고 있으니 함 해보세요.^^;
반응형