> Mysql은 제가 알기로.. table lock을 하는것으로 알고 있습니다.
> 이 문제 때문에... 동시 사용자가 많은 Web에서는 문제가
> 있다고 생각했습니다만.. 어쩔 수 없이 Mysql을 쓰게 되었네여..
> -_-;
>
> 현재 프로젝트 완료시점에서 문제가 생긴것은 바로 table lock
> 문제입니다.
> 제가 간과한 점이.. Mysql이 Read Lock을 수행한다는 점이었습니다.
>
> 이 때문에... 최대한 Insert/Update/Delete를 억제하고...
> 될 수 있으면... 같은 table에서 동시에 일어나지 않도록 설계한
> 저의 노력이 물거품이 되어버렸습니다... -_-;
>
> 그런데... 상식적으로 생각할 때... 한 프로세스가 database의
> 특정 table을 잡고 있어.. lock이 걸려있을 때.. 다른 프로세스가
> 특정 table에 접근하려고 하면.. 기다려야 하는데...
>
> Mysql C api의 경우... mysql_query()가 에러를 내고 그냥
> return해 버리는군요...
>
> 그래서... table에 lock이 걸려있을 때.. 접근한 프로세스에서
> database에 접근을 하려고 할 때... lock이 해제될때가지
> 기다리던지.. 아니면 특정시간 이후에 retry를 하던지..
> 하여간.. 그렇게 mysql을 tuning할 수 있는지 알고 싶습니다.
>
> 자료를 잘 찾아보았는데... 못 찾겠더군요..
>
> lock에 관한 자료들은 여러곳에서 찾아보았었는데...
> 기본적인 내용들이라.. 저에게는 별로 도움이 되지 않았습니다.
> 참고로... 가능한 Update는 한꺼번에 해라... 라는 식의 해결책은
> 사실 해결책이라고 볼 수 없습니다... 저에게 있어서...
>
> 아뭏든... 고수님들의 답변 기다리고 있겠습니다.
참고 : 번역자료(http://taejun.pe.kr/mysql/manual/10.txt)에서
관련부분을 옮깁니다.
그런데 매뉴얼에서 설명은 write락을 걸면 이후의 요구는 큐에서
기다리다가 락을 해제하면 다시 락을 거는 것으로 되어있는데요.
질문하신 것으로 봐서는 이것이 안 된다는 것이지요?
일단 아래 나온 내용을 참고하시고요. 테스팅해보세요. 저는 c api는
워낙 사용해본지 오래되어서 직접적으로는 도움을 못 드리겠네요.
---------------------------------------------------------------
10.9 테이블에 락 거는 방법
mysql의 모든 락은 deadlock-free 이다. 언제나 질의를 시작할때 한번에 모든 필요한 락을 요청하고 언제나 같은 순서대로 테이블에 락을 걸어 관리한다.
WRITE 락을 사용하는 방법은 다음과 같다:
- 테이블에 락이 없으면 그 테이블에 write 락을 건다.
- 이런 경우가 아니라면 write 락 큐에 락을 요청한다.
READ 락을 사용하는 방법은 다음과 같다:
- 테이블에 write 락이 없으면 그 테이블에 read 락을 건다.
- 이런 경우가 아니라면 read 락 큐에 락을 요청한다.
락이 해제되었을 때 락은 write 락 큐의 스레드에서 사용할 수 있으며 그러고 나서 read 락 큐의 스레드에서 사용한다.
테이블에서 업데이트를 많이 하면 SELECT 문은 더 이상 업데이트가 없을 때까지 기다린다는 것을 의미한다.
이러한 문제를 해결하기 위해 테이블에서 INSERT 와 SELECT 오퍼레이션을 많이 사용하는 경우에 다음과 같이 하면 된다. 임시 테이블에 레코드를 입력하고 한번에 임시 테이블에서 실제 테이블로 레코드를 업데이트한다.
다음의 예를 보자:
mysql> LOCK TABLES real_table WRITE, insert_table WRITE;
mysql> insert into real_table select * from insert_table;
mysql> delete from insert_table;
mysql> UNLOCK TABLES;
만약 어떤 경우에 SELECT문에 우선권을 주고 싶다면 INSERT 옵션에서 LOW_PRIORITY or HIGH_PRIORITY 옵션을 사용할 수 있다. 7.13 [Insert] 참고. (** LOW_PRIORITY를 지정하면 클라이언트에서 테이블을 읽지 않을 때까지 INSERT 문 수행이 미루어진다. **)
단일 큐를 사용하기 위해 `mysys/thr_lock.c' 의 락킹 코드를 바꿀 수 있다. 이런 경우 write 락과 read 락은 같은 우선권을 가지며 어떤 애플리케이션에서는 유용할 수 있다.
|