2010-06-08 3 views
2

데이터베이스에 데이터를 쓰는 다른 작업을 처리하는 웹 서비스 (정확한 xmlrpc 서비스)가 있습니다. 이 시나리오는 다음과 같습니다.여러 아파치 스레드가 데이터베이스에 액세스하려고 할 때 어떻게 하나의 레코드 만 삽입되도록 할 수 있습니까?

종종 레코드를 업데이트하거나 삽입하라는 요청을받습니다. 내가 뭘 할 것은 이것이다 : 레코드가 이미 존재

  1. 경우, 새로운 기록
를 작성,
  • 그렇지 않은 경우, 기록에 추가

    문제는 특정 시간이 나는 것이 있다는 것입니다 요청을 처리하는 여러 개의 아파치 스레드를 생성하는 요청의 '버스트 (burst)'를 얻는다. 이러한 '파열'은 서로의 밀리 초 이내에 발생합니다. # 1과 # 2를 수행하는 여러 스레드가 있습니다. 종종 두 개의 스레드가 # 1의 숫자를 '통과'하여 실제로는 기본 키를 제외하고 두 개의 중복 된 레코드를 만듭니다.

    다른 스레드가 작업을 완료하는 동안 다른 스레드가 테이블에 액세스하지 못하도록 일부 잠금 메커니즘을 사용하고 싶습니다. 나는 무언가가 일어나는 경우에 테이블을 잠그고 싶지 않기 때문에 그것을 사용하는 것을 두려워합니다.

    • 업데이트 : 테이블에 이미 기본 키가 있습니다. 이상적인 상황은 첫 번째 스레드가 존재하지 않으면 첫 번째 스레드가 레코드를 작성해야하고 두 번째 스레드가 들어 오면 다른 레코드를 작성하지 않고 이미 작성된 레코드를 갱신하는 것입니다. 마치 스레드가 단일 파일 행을 만들도록하려는 것입니다.

    제대로 처리 할 수있는 방법이 있습니까? 제대로 할 수 있다면 잠금 장치를 사용할 수 있습니다. 당신이 당신의 테이블에 고유 인덱스를 추가하는 경우, 두 번째 삽입이 실패합니다

  • 답변

    1

    감사합니다. 따라서 모든 로직은 데이터베이스 서버에 의해 수행되며 사용자에게 오류를 표시하기 만하면됩니다 ... 또한 이러한 시나리오에서는 삽입 작업 중에 테이블 [s]을 잠글 필요가 없습니다.

    5

    고유 또는 기본 인덱스 및 사용에 추가 :이 트랜잭션의 원자 작업을 형성하는 여러 단계를 넣을 수 있습니다

    INSERT INTO table (..) VALUES (...) ON DUPLICATE KEY UPDATE ..... 
    
    +0

    테이블에 이미 기본 키가 있습니다. 내 상황에서는 기본 키가 이전보다 1 개 많다는 것을 제외하면 두 개의 레코드가 동일합니다. 이상적인 상황은 첫 번째 스레드가 존재하지 않으면 첫 번째 스레드가 레코드를 작성해야하고 두 번째 스레드가 들어 오면 다른 레코드를 작성하지 않고 이미 작성된 레코드를 갱신하는 것입니다. 마치 스레드가 단일 파일 행을 만들도록하려는 것입니다. :) – EDJ

    +0

    어떻게 그것이 중복 볼 수 있습니까?언급하려는 열에 고유 한 색인을 추가하십시오. 고유 인덱스는 하나 이상의 열에 걸쳐있을 수 있습니다. 그런 다음 ON DUPLICATE KEY UPDATE가 정확히 수행 할 수 있습니다. – Wrikken

    +0

    에드, 그게 말이되지 않습니다. 어느 행을 유일하게 식별 할 수있는 방법 (자동 증가 키)과 Wrikkens 메서드가 작동합니다. 또는, 그럴 수 없다면 "행"에 대해 말할 수 없습니다. 고유 한 이름이 없으므로 행을 업데이트 할 방법이 없기 때문입니다. – serbaut

    1

    0

    당신이 진정으로 프로세스를 직렬화하려면, 당신은 잡아 수 있습니다 테이블 잠금 tablename 서비스 시작시 작성하고 완료되면 테이블 잠금 해제.

    Innodb 및 트랜잭션을 사용하는 경우 트랜잭션 시작 후 테이블 잠금을 수행해야합니다.

    대개 더 나은 처리 방법이 있으므로이 방법을 권장하지 않지만 신속하고 더러운 솔루션이 필요한 경우 최소한의 코드 변경으로 작동합니다.

    +0

    이것은 내가 생각하고 있던 것이지만 다른 사람들의 의견을 듣고 더 나은 방법이 있는지 알아 보도록하겠습니다. :) ON DUPLICATE KEY와 같은 방법이 될 것 같습니다. – EDJ

    관련 문제