2009.02.12 11:34

MySQL - LOCK을 이용해 트랜잭션 구현

다중 처리를 하나의 작업단위로 처리하는것을 트랜잭션이라고 합니다.

MySQL 에서는 하나의 MyISAM 테이블에 Insert, Update, Delete SQL 쿼리문을 실행할때 한명의 유저가 액세스를 하게 되면 문제가 없으나 여러명의 유저가 동시에 액세스를 하게되면 잘못된 순서로 데이타 처리가 일어날수 있습니다.

왜냐하면 여러명의 유저가 여러 명령을 하나의 테이블에 한꺼번에 하기 때문이다.

이런경우에는 반드시 일의 단위를 구분짓고 트랜잭션 처리를 해야 한다.

MySQL 에서는 Innodb 라는 테이블 종류로 트랜잭션이 지원하지만 설치를 따로 해야 하고 설정도 따로 해야 하는 단점이 있다.

트랜잭션 기능이 없는 MyISAM 테이블을 사용할때 한테이블에 연속으로 여러 row 처리를 하게되면 모든 처리가 한계정에 한해 차례대로 처리된다는 보장이 없기 때문에 다중 DB처리가 필요할때는 꼭 테이블에 lock과 unlock 처리를 해줘야 합니다.

READ LOCK

lock tables test read;

lock을 건 스레드와 그외 모든 스레드에서 select 만 가능하다.

lock을 건 스레드와 그외 모든 스레드에서 insert, update, delete는 불가능하다.

unlock tables;

lock을 건 스레드에서만 unlock이 가능합니다.

A에서 lock을 걸고 B에서 unlock을 해도 A에서 lock을 건 테이블에 insert,update,delete는 되지 않습니다. 반드시 A에서 unlock을 해야 합니다.

read lock시 다른 유저에서 insert,update,delete을 하게되면?

lock을 건 테이블에 insert,update,delete을 하게되면 대기 모드로 변하게 되며 unlock을 한후에야 대기모드에서 나와 실행모드로 변경되어 실행합니다.

WRITE LOCK

lock tables test write;

-lock을 건 스레드에서만 read,write가 가능하다.

-그외 모든 스레드에서는 read,write가 불가능하다.

unlock tables;

lock을 건 스레드에서만 unlock이 가능합니다.

A에서 lock을 걸고 B에서 unlock을 해도 A에서 lock을 건 테이블에 select,insert,update,delete는 되지 않습니다. 반드시 A에서 unlock을 해야 합니다.

write lock시 다른 유저에서 select,insert,update,delete을 하게되면

lock을 건 테이블에 insert,update,delete을 하게되면 대기 모드로 변하게 되며 unlock을 한후에야 대기모드에서 나와 실행모드로 변경되어 실행합니다.

LOCK이 필요할때

lock table trans read, customer write;
select sum(value) from trans where customer_id=some_id;
update customer set total_value=sum_from_previous_statement
where customer_id = some_id;
unlock tables;

여기서 lock tables을 사용하지 않았을 경우, select와 update을 하는 잠깐 사이에 다른 스레드에서  trans테이블의 값을 바꿀수 있기 때문에 lock tables을 사용해야 합니다.

LOCK TABLES UNLOCK TABLES


출처 : http://www.zetblog.net/

Trackback 1 Comment 0