본문 바로가기

MySQL

Mysql 트랜잭션 사용하기

[ 트랜잭션 이란 ? ] 
어떤 작업을 수행할 때 작업이 실패하더라도 이 잘못된 작업이 실질적으로 수행해야 할 작업에는 영향을 미치지 않도록 하는 기능이다. 
예를 들어서, 내가 계좌이체를 승인하는 버튼을 눌렀을 때 정전이 일어났을 경우 이미나의 통장에서는 돈이 빠져나간 상태이고 상대방에게는 이체가 되지 않은 상황이 발생하게 된다. 
그럼 이 돈은 어떻게 되는 것 일까요? 
이러한 문제가 발생하지 않도록 해주는 기능을 트랜잭션이라고 할 수 있겠습니다.

 

mysql에서의 트랜잭션은 버전 3.23.x 버전부터 지원가능 합니다. 
그러므로 3.22.x 버전 사용자를 트랜잭션을 사용할 수 없게 되어있습니다. 
3.23.x 버전에서 트랜잭션기능을 사용하기 위해서는 버클리대학에서 만든 버클리 DB를 설치해야 합니다.

 

이 버클리 DB 는 mysql을 바이너리로 설치할 경우 자동으로 설치가 되며, 소스로 설치 할 경우 따로 버클리 DB 를 설치해야 트랜잭션을 사용 가능합니다. 
mysql-3.23.34 에서는 BDB 소스가 Mysql 소스 안에 포함되어 있기 때문에 소스를 받아 설치 할 필요가 없습니다. 
단지 Mysql을 컴파일 할 때 옵션만 추가해 주면 됩니다. [ --with-bekeley-db ]

 

 

[ 트랜잭션 사용하기 ] 
트랜잭션을 사용하기 위해서는 테이블을 create 시킬 때 테이블 타입을 BDB로 설정해야 한다. 일반적으로 테이블 타입을 선택하지 않을 경우는 MYISAM으로 만들어진다.

 

  1. 테이블 만들기 
     mysql> create table test ( 
         -> num int(8) not null auto_increment, 
         -> name varchar(20), 
         -> primary key(num) 
         -> ) type=BDB; 
     Query OK, 0 rows affected (0.00 sec)

 

  2. 데이타 입력하기 
     mysql> insert into test (name) values ('soma'); 
     Query OK, 1 row affected (0.00 sec)

 

  3. set autocommit=0 설정하기 
    이 옵션은 변경된 데이타의 내용을 테이블에 바로 쓰지 않게 하기 위함이다. 
    set autocommit=0 로 설정하면 commit 명령어를 내리기 전까지는 테이블에 적용 하지 않는다. 
    rollback 명령어를 내리면 이전 값으로 되돌려 놓는다. 
    Myisam 타입은 이 autocommit의 값이 0 이라도 변경된 값이 바로 테이블에 쓰여지게 된다.


    mysql> set autocommit = 0; 
    Query OK, 0 rows affected (0.00 sec)

 

  4. begin 명령어 입력하기 
    이 명령어는 트랜잭션을 시작한다는 것을 알린다. 
    mysql> begin; 
    Query OK, 0 rows affected (0.00 sec)

 

  5. UPDATE 시키기 
    mysql> update test set name = 'jeje' where num = '1'; 
    Query OK, 1 row affected (0.00 sec) 
    일치하는 Rows : 1개 변경됨: 1개  경고: 0개

 

  6. 확인하기 
    mysql> select * from test; 
    +-----+------+ 
    | num | name | 
    +-----+------+ 
    |     1 | jeje   | 
    +-----+------+ 
    1 row in set (0.00 sec)

 

  7. ROLLBACK 사용하기 
    mysql> rollback; 
    Query OK, 0 rows affected (0.00 sec)

 

  8. 확인하기 
    mysql> select * from test; 
    +-----+------+ 
    | num | name | 
    +-----+------+ 
    |     1 | soma | 
    +-----+------+ 
    1 row in set (0.00 sec)

 

  9. COMMIT 사용하기 
    mysql> update test set name = 'jeje'; 
    Query OK, 1 row affected (0.00 sec) 
    일치하는 Rows : 1개 변경됨: 1개  경고: 0개


    mysql> commit; 
    Query OK, 0 rows affected (0.02 sec)


    mysql> select * from test; 
    +-----+------+ 
    | num | name | 
    +-----+------+ 
    |     1 | jeje   | 
    +-----+------+ 
    1 row in set (0.00 sec)


    변경된 값을 테이블에 쓰기 위해서는 COMMIT 이라는 명령어를 사용해야 한다. 
    되돌리고 싶을 때는 ROLLBACK 명령어를 사용하면 된다.

 

 

만약 하나의 DB 서버에 여러 사용자가 접속을 하여 사용 할 경우, 
이때 한 사용자 트랜잭션을 수행하고 있을 때 다른 사용자가 트랜잭션을 수행하는 테이블에 어떠한 요청을 하였다고 가정하자. 그럼 어떠한 문제가 발생할까? 
트랜잭션이 수행되고 있는 테이블에 다른 사용자가 요청을 하게 되면 COMMIT 이나 ROLLBACK 명령어가 수행되기 전까지 대기상태로 남아있게 된다. 
COMMIT 이나 ROLLBACK 명령어가 떨어지면 해당 요청에 대한 결과값을 보여주게 된다.