데이터베이스에 데이터를 쓰는 다른 작업을 처리하는 웹 서비스 (정확한 xmlrpc 서비스)가 있습니다. 이 시나리오는 다음과 같습니다.여러 아파치 스레드가 데이터베이스에 액세스하려고 할 때 어떻게 하나의 레코드 만 삽입되도록 할 수 있습니까?
종종 레코드를 업데이트하거나 삽입하라는 요청을받습니다. 내가 뭘 할 것은 이것이다 : 레코드가 이미 존재
- 경우, 새로운 기록
문제는 특정 시간이 나는 것이 있다는 것입니다 요청을 처리하는 여러 개의 아파치 스레드를 생성하는 요청의 '버스트 (burst)'를 얻는다. 이러한 '파열'은 서로의 밀리 초 이내에 발생합니다. # 1과 # 2를 수행하는 여러 스레드가 있습니다. 종종 두 개의 스레드가 # 1의 숫자를 '통과'하여 실제로는 기본 키를 제외하고 두 개의 중복 된 레코드를 만듭니다.
다른 스레드가 작업을 완료하는 동안 다른 스레드가 테이블에 액세스하지 못하도록 일부 잠금 메커니즘을 사용하고 싶습니다. 나는 무언가가 일어나는 경우에 테이블을 잠그고 싶지 않기 때문에 그것을 사용하는 것을 두려워합니다.
- 업데이트 : 테이블에 이미 기본 키가 있습니다. 이상적인 상황은 첫 번째 스레드가 존재하지 않으면 첫 번째 스레드가 레코드를 작성해야하고 두 번째 스레드가 들어 오면 다른 레코드를 작성하지 않고 이미 작성된 레코드를 갱신하는 것입니다. 마치 스레드가 단일 파일 행을 만들도록하려는 것입니다.
제대로 처리 할 수있는 방법이 있습니까? 제대로 할 수 있다면 잠금 장치를 사용할 수 있습니다. 당신이 당신의 테이블에 고유 인덱스를 추가하는 경우, 두 번째 삽입이 실패합니다
테이블에 이미 기본 키가 있습니다. 내 상황에서는 기본 키가 이전보다 1 개 많다는 것을 제외하면 두 개의 레코드가 동일합니다. 이상적인 상황은 첫 번째 스레드가 존재하지 않으면 첫 번째 스레드가 레코드를 작성해야하고 두 번째 스레드가 들어 오면 다른 레코드를 작성하지 않고 이미 작성된 레코드를 갱신하는 것입니다. 마치 스레드가 단일 파일 행을 만들도록하려는 것입니다. :) – EDJ
어떻게 그것이 중복 볼 수 있습니까?언급하려는 열에 고유 한 색인을 추가하십시오. 고유 인덱스는 하나 이상의 열에 걸쳐있을 수 있습니다. 그런 다음 ON DUPLICATE KEY UPDATE가 정확히 수행 할 수 있습니다. – Wrikken
에드, 그게 말이되지 않습니다. 어느 행을 유일하게 식별 할 수있는 방법 (자동 증가 키)과 Wrikkens 메서드가 작동합니다. 또는, 그럴 수 없다면 "행"에 대해 말할 수 없습니다. 고유 한 이름이 없으므로 행을 업데이트 할 방법이 없기 때문입니다. – serbaut