mariadb, mysql - MySQL - LOCK을 이용해 트랜잭션 구현, MyISAM 트랜잭션, 잠금, 락
이 름 : 바다아이
|
조회수 : 3680
짧은 주소 : https://www.bada-ie.com/su/?151611573883
다중 처리를 하나의 작업단위로 처리하는것을 트랜잭션이라고 합니다.
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을 사용해야 합니다.
주의 : 만약 테이블 잠겨서 문제 생기면 mysql 을 재시작 하시면 됩니다.
출처 : http://www.zetblog.net/
2차 출처: https://blog.pages.kr/131
p.s
가급적 테이블 형식은 MyISAM 보다는 innodb 를 사용하시길 권합니다. 트랜잭션이 지원되니까요..
안정성 면에서도 innodb 가 좋습니다.
|
|
번 호
카테고리
제 목
이름
조회수
Copyright ⓒ 2001.12. bada-ie.com. All rights reserved.
이 사이트는 리눅스에서 firefox 기준으로 작성되었습니다. 기타 브라우저에서는 다르게 보일 수 있습니다.
[ Ubuntu + GoLang + PostgreSQL + Mariadb ]
서버위치 : 오라클 클라우드 춘천 실행시간 : 0.06084 초 to webmaster... gogo sea. gogo sea.