database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 118 게시물 읽기
No. 118
Re: Mysql C api에서...
작성자
문태준
작성일
1999-11-15 19:54
조회수
19,934

> 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 락은 같은 우선권을 가지며 어떤 애플리케이션에서는 유용할 수 있다.

[Top]
No.
제목
작성자
작성일
조회
120Mysql에서~~~ 알려주시면 감사!
이관철
1999-11-18
17347
119초보임니다...load data local infile "파일이름" into table 테이블이름;
강순권
1999-11-17
16766
121┕>Re: 초보임니다...load data local infile "파일이름" into table 테이블이름;
문태준
1999-11-18 01:10:39
17648
1167 장 언제쯤 나오나요 ????
모모
1999-11-15
18142
117┕>Re: 7 장 언제쯤 나오나요 ????
문태준
1999-11-15 19:40:15
18069
115Mysql C api에서...
전승혁
1999-11-15
17932
118┕>Re: Mysql C api에서...
문태준
1999-11-15 19:54:19
19934
112mysqlimport에 대한 질문
김윤찬
1999-11-12
18713
113┕>Re: mysqlimport에 대한 질문
문태준
1999-11-12 15:25:46
20947
111[급질문] perl + mysql db 연동에 관해서 꼭좀 답변부탁드립니다.
비의비
1999-11-11
18620
114┕>Re: [급질문] perl + mysql db 연동에 관해서 꼭좀 답변부탁드립니다.
정재익
1999-11-13 14:30:29
19295
107MySql의 라이센스?
연제범
1999-11-10
19227
110┕>Re: MySql의 라이센스?
정재익
1999-11-10 22:23:15
20687
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.052초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다