2013-08-11 4 views
0

비교적 큰 (6 천만 행) MySQL 테이블에 동시에 삽입/선택하는 두 명의 작업자가 있습니다.외래 키에 대한 모든 삽입이 완료 될 때까지 지정된 외래 키에 대한 쿼리를 차단합니다.

  1. 작업자 1은 새 행을 삽입하고 새 행의 외래 키가 포함 된 메시지를 대기열에 추가합니다. 이것은 주어진 외부 키 값에 대해 매일 약 1 회 발생합니다.
  2. 작업자 2는 메시지를 대기열에서 제외하고 테이블의 외래 키에 대한 최신 레코드를 쿼리하고 더 처리합니다.

작업자 2는 테이블에서 최신 레코드를 얻지 못하는 것 같습니다. 외래 키의 삽입이 완료 될 때까지 주어진 외래 키에 대한 Worker 2의 쿼리를 차단하는 방법이 있습니까? 사전에

감사

답변

1

아마 정확하게 대답하기 위해 몇 가지 중요한 정보가 부족하지만 ...

... 내 추측을 변경 한 전에 "메시지가"도착이다 하나의 거래에서 DB에 대한 거래는 다른 거래에서 볼 수 있습니다.

트랜잭션 분리 수준 (1)에 따라 트랜잭션을 성공적으로 커밋하기 전에 변경 내용이 으로 전파되지 않습니다. 그리고 (2) 새로운 거래를 시작할 때까지 DB의 새로운 상태가 보이지 않습니다.

내가 아는 한, MySQL은 "전달 지연"을 보장하지 않습니다. 그리고 MySQL이 트랜잭션이 성공적으로 커밋되거나 변경 내용이 표시되는 것보다 다른 연결을 알리는 메커니즘이 없다고 생각합니다.


나는 당신의 시스템을 잘 모르겠지만, 그냥 조언, 나는이 메시지 큐를 사용하여 하지만 실제 변경 데이터를 저장하기 위해 MySQL을 사용 변화를 신호로 생각하지 않습니다 좋은 솔루션입니다 . 내가 당신이라면, RabbitMQ과 같은 적절한 메시징 시스템을 살펴보고 변경을 알리는 것을 허용 할뿐만 아니라 새로운 상태를 유지할 것입니다. RDBMS. 어쩌면 당신은 프로세스 변경 메시징 큐를 사용하기 위해 귀하의 응용 프로그램을 리팩터링 할 수 있으며, 단 한번 완료되면 MySQL을 사용하여 데이터를 영구적으로 저장하십시오.

관련 문제