2016-10-03 5 views
0

나는 하나의 테이블에서 하나의 레코드를 가져 와서 처리하고 처리 할 때 제거해야하는 여러 프로세스가 있습니다. 테이블의 모든 레코드는이 방법으로 처리해야합니다.여러 개의 동시 프로세스가있는 데이터베이스 테이블 비우기

모든 프로세스가 서로 다른 레코드를 사용하고 단일 실패 지점을 만들지 않고 레코드를 건너 뛰지 않도록하는 가장 좋은 방법은 무엇입니까?

+0

어떤 DBMS를 사용하고 있습니까? –

+0

다음 사용 가능한 소비자에게 작업 대기열을 할당하려는 것처럼 들립니다. –

+0

사실 저는 지금 사용할 DBMS가 아니지만 DB2가 될 가능성이 있습니다. –

답변

1

과거에이 작업을 수행 한 방식은 처리중인 테이블에 "status"및 "worked_id"열을 추가하는 것입니다. 레코드는 상태 "처리되지 않음"에서 "처리 중"으로 "완료"로 이동합니다.

각 스레드가 다음 라인을 따라 작업을 시작

:

update table 
set status = processing, 
     worker_id = <<my thread ID>> 
where status is null 
and <<some way to select the rows you want to process>> 

스레드가 행을 처리; 다음은 수행 된 후에는 :

delete from table 
where status = processing 
and worker_id = <<my thread ID>> 
and <<some way to select the rows you just processed>> 

데이터베이스의 상태를 저장함으로써, 당신은 전성 검사를 만들 수 있습니다 - 예를 들어, 응용 프로그램 시작 및 종료, 당신은 상태 "처리"에 행이없는시기. 응용 프로그램이 충돌하면 영향을받은 행을 찾을 수 있습니다. 그런 다음 수행 할 작업을 결정할 수 있습니다. 출력을 정리할 필요가있을 수 있지만 "처리되지 않음"으로 표시하면 해당 프로세스를 다시 실행할 수 있습니다.

트랜잭션에 문을 래핑하는 경우 (이 예제보다 더 복잡한 논리를 사용하는 경우) 원 자성을 보장 할 수 있습니다.

+0

업데이트가 커밋되지 않은 경우이 방법이 유용할까요? 프로세스 중 하나라도 충돌하면 롤백해야하므로 다른 프로세스에서 레코드를 가져올 수 있습니다. –

+0

귀하의 의견을 듣고 답변을 업데이트했습니다. –

1

생산자 - 소비자 패턴을 사용하십시오.

단일 스레드를 사용하여 SELECT 행의 db를 처리하고 액트 프로세스를 처리 할 N 작업자 스레드에 배포하십시오. 작업자 만 처리 된 행에 액세스 할 수 있다고 가정하면 DELETE도 수행 할 수 있습니다.

+0

고마워, 나는 이것에 대해,하지만 이것은 단일 실패 지점을 만들 것입니다. 정말 피할 필요가있는 부분입니다. 또한 자바 스레드가 아닌 독립적 인 프로세스가 될 수 있습니다. 나는 그것을 반영하기 위해 질문을 편집했다. –

+0

스레드 또는 프로세스가 중요하지 않습니다. 어느 쪽이든 단일 실패 지점이 될 수있는 일종의 동기화가 필요합니다. – Antoniossss

관련 문제