본문 바로가기
DB/MySQL

트랜잭션(Transaction)

by 가므자 2012. 3. 21.

은행 현금인출기(ATM)에서 돈을 인출하는 과정을 생각해 봅시다.
현금인출을 하겠다고 기계에게 알려준뒤 현금카드를 넣어서 본인임을 인증받고,
인출할 금액을 선택하면 ATM 기는 돈을 내어줍니다.
이러한 거래에 있어서 지켜져야 할 중요한 것이 있습니다.
기계의 오동작 등으로 인하여 전산상으로는 돈을 인출한 것으로 입력이 되었는데 돈은 안나온다거나,
돈은 나왔는데 일련의 에러나 문제로 인하여서 돈을 인출한 것이 전산상으로 입력이 안되면
상당히 심각한 문제가 발생하겠죠.
때문에 전산상으로도 입력이 정상적으로 잘 되고, 돈도 인출이 정상적으로 잘 됨을 확인하고 나서야,
인출하는 하나의 과정이 정상적으로 처리되었음을 확인할 수 있습니다.
여기서 돈을 인출하는 일련의 과정이 하나의 묶음으로 처리되어야 함을 이해하실 수 있을것입니다.
그리고 혹시 처리도중 중간에 무슨 문제가 발생한다면 진행되던 인출과정 전체를 취소하고
다시 처음부터 시작하도록 해야 될 것입니다.
이것을 트랜잭션이라고 합니다.
transaction 의 사전적의미와도 상통합니다만, 거래함에 있어서 거래하는 양측이 다 원하는
결과물을 얻어야만 정상적으로 처리되는 것이고
그렇지 않다라면 거래자체가 무산되어 원점으로
되돌려져(roll back) 버리는 것이죠.
전산적으로나 데이터베이스에 있어서도 이처럼 하나의 묶음으로 처리가 이루어져야 하는 모든것에
트랜젝션이란 개념이 사용됩니다.
롤백(roll back) 이란 것은 트랜잭션으로 인한 하나의 묶음처리가 시작되기 이전의 상태로 되돌려지는 것을 말합니다.
커밋(commit) 이란 것은 정상적으로 처리되어서 확정(실행을 위해서 엔터키를 치는 것처럼) 한다는 것이구요. 커밋하면 트랜잭션의 처리과정이 모두 반영되며 하나의 트랜잭션 과정이 끝나게 됩니다.

트랜잭션을 사용할 때 장점
- 서버가 깨지거나 하드웨어적인 문제가 발생하더라도 자동복구 기능이나 백업된 트랜잭션 로그를 이용하여 데이터를 살릴 수 있다.
- Commit 명령을 이용하여 여러 개의 SQL 문을 하나로 합쳐서 실행할 수 있다.

Transaction의 특징
- A (원자성) : 트랜잭션을 구성하는 모든 명령이 실행되거나 어떠한 명령도 실행되지 않아야 한다. 트랜잭션의 일부만을 수행할 수 없다. (데이터 손실이 일어날 수 있기 때문) 쿼리문이 모두 실행되거나 아니면 아예 안되던 둘 중 하나여야 한다는 뜻이다.
- C (일관성) : 트랜잭션이 끝난 후 DB는 일관성을 유지해야 한다. 쿼리 전 후의 데이터가 알맞아야 한다.
- I (독립성) : 모든 트랜잭션은 동시에 일어나는 다른 트랜잭션과 상관없이 DB에 일관된 뷰를 가지고 있다. 예) A가 현금 인출기에서 돈을 빼내는 동안 B는 현금 인출기 잔고를 볼 수 없도록 해야하거나 "트랜잭션 진행 중"이라는 메세지가 나와야 한다.(결과가 맞아야 하니까)
- D (지속성) : 트랜잭션이 끝난 후, DB는 데이터를 정확히 저장하고 정전이나 그 외의 이상 상황으로부터 데이터를 보호해야 한다. 보통 트랜잭션의 기록을 주 데이터베이스 외에 다른 위치의 데이터베이스에 저장하는 방식을 사용한다.

MySQL에서의 트랜잭션
트랜잭션을 사용하기 위해 자동으로 COMMIT 되는 것을 막아주어야하는데, 트랜잭션 작업이 실패했을 경우 자동으로 COMMIT 되면 데이터베이스를 실패한 정보가 저장될 것이다.
그래서 하나의 작업이 모두 끝났을 때 COMMIT를 해주어야아 하기 때문에 AUTOCOMMIT 모드를 실행하지 않기 위해서 SET 명령으로 AUTOCOMMIT를 설정한다.

mysql> SET AUTOCOMMIT =0;

트렌잭션을 사용하기 위해서 BEGIN WORK 명령을 실행하면 이전에 실행되던 모든 SQL문을 COMMIT 하게 된다. 따라서 그전 SQL 문장에 의심이 잇다면 반드시 ROLLBACK을 실행한다.

mysql> BEGIN WORK

BEGIN WORK 명령어를 실행하여 하나의 트랜잭션을 시작한다.

mysql> COMMIT

트랜잭션이 성공하여 데이터베이스에 정보의 내용을 저장

mysql> ROLLBACK

변경된 작업이 취소된다.

트랙젝션의 전체 프로시져를 살펴보면,
Begin Transaction - (작업) - if(작업완료) -> Commit
else(작업실패) -> Roll Back

그러니까, 모든 작업이 성공한 경우 Commit 을 해주고, 중간에 조금이라도 실수가 있었다면 Roll Back 을 하게 됩니다. 롤백을 하면 Begin Transaction 을 하기전까지의 상태로 돌릴 수가 있습니다.
Commit 은 Begin Transaction 부터 지금까지의 작업 완료하게 되고, Commit 을 해야만 비로소 DB 가 업데이트 되는겁니다.

'DB > MySQL' 카테고리의 다른 글

락(LOCK)  (0) 2012.03.21
innodb 설정  (0) 2012.03.21
뷰(View)  (0) 2012.03.20
인덱스의 사용  (0) 2012.03.19
테이블의 변경  (0) 2012.03.19

댓글