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 29655 게시물 읽기
No. 29655
여러 클라이언트에서 데이터를 하나씩 꺼내갈때
작성자
김대일(ztelnet)
작성일
2010-05-15 23:30
조회수
7,299

job 이라는 table이 있습니다.

대략

job_id int

end_yn char(1)

 

이런 형태로 구성되어 있습니다.

저기에 해야될 job이 쭉 들어있고,

여러 클라이언트에서 job을 하나씩 꺼내간 다음에 작업을 하게 되어 있습니다.

 

예를 들어서 select job_id from job where end_yn='N' limit 0,1 과 같이 해서

job을 하나씩 꺼내가게 되어 있습니다.

꺼내가면서 바로 update job set end_yn='I' where job_id=? 과 같이

작업중임을 알릴수 있도록 end_yn 값을 I 로 바꾸고 시작합니다.

실제 작업이 종료되면 다시 Y 로 값을 바꾸고 있습니다.

 

아시다시피 select 하고 update 하기전에 거의 동시에 select 가 일어나게 되면

2개의 클라이언트가 같은 값을 꺼내가게 됩니다.

이 문제를 해결하고 싶은데요.

 

현재 job 데이터는 약 10만건 정도 있고,

클라이언트가 20개 정도 있습니다

이 경우 대략적으로 100건중에서 3-4건 정도 중복이 발생합니다.

 

lock 을 걸게 되면 중복은 발생하지 않더라도 혹시 속도 저하가 발생하지 않을까 우려가 되고, 최악의 경우 lock이 걸린채로  무한대기 상태가

되지 않을까도 좀 걱정스럽습니다.

사실 같은 job을 조회한다고 하더라도 심각한 문제가 있는건 아닙니다.

단지 중복으로 작업을 하기 떄문에 퍼포먼스가 떨어지는거구요.

 

 

전체적인 속도에 영향을 미치지 않고 좀더 좋은 방법이 있을지 문의 드립니다.

 

이 글에 대한 댓글이 총 2건 있습니다.

 locking 밖에 해결할 묘수가 있을런지 모르겟군요.. 

모든 문제를 해결할려면은.....미들웨어를 도입하는게.....흠...

백록화(백록화)님이 2010-05-16 03:57에 작성한 댓글입니다.

LOCK에 대한 무한 대기 상태가 걱정되신다면, 어플리케이션 레벨에서 LOCK하지 말고, 프로시저를 이용해서 LOCK을 하는 것이 좀 더 안전하겠군요.

 

해당 프로시저에서 명시적 LOCK을 걸고, 값을 추출한 후에, 컬럼 값을 변경하고, UNLOCK한 후에, 얻어낸 값을 리턴하여 어플리케이션이 가져가도록 하면 될 것 같습니다.

 

Lockless하게 작업하는 방법을 생각해보았지만, 뾰족한 수가 떠오르지는 않네요.

박현우(lqez)님이 2010-05-17 15:40에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
29658프로시저 관련 질문입니다. [2]
백승범
2010-05-17
8844
29657oracle TO_NUMBER를 Mysql로 변경하기 [1]
인투폴
2010-05-17
15040
29656여러게의 필드를 하나인덱스에 넣었을때 어떤차이가 있나요. [2]
VQ
2010-05-17
8069
29655여러 클라이언트에서 데이터를 하나씩 꺼내갈때 [2]
김대일
2010-05-15
7299
29654특정 문자열만 포함 하는 쿼리 가능한가요? [1]
이홍섭
2010-05-14
8452
29653그룹별 개수 및 합계구하는거 좀 알려주세요~ [10]
윤은숙
2010-05-13
9860
29651select 문에 공식을 재사용 할 수 있나요. [2]
송기창
2010-05-13
7403
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다