2012-06-09 4 views
0

저는 조직에서 작업 지시를 추적하기 위해 개발중인 MySQL 데이터베이스 (InnoDB)가 있습니다. 이 다수의 사이트는 '이며, 각 사이트 WorkorderID가 자동 증가 필드 (100)MySQL은 자동 증가가없는 다음 고유 값을 얻습니다.

WorkorderID SiteID SiteWorkorderNum 
    1   1   100 
    2   1   101 
    3   2   100 

에서 시작하는 작업 주문 번호를 가지고있다.
사이트 IDSiteWorkorderNum은 모두 고유 한 제약 조건으로 설정됩니다.

특정 작업 사이트에 대해 새로운 작업 주문이 삽입 될 때마다 응용 프로그램은 로그인 한 사람의 siteid에 대한 max (SiteWorkorderNum)를 확인하고 해당 값을 insert 문에 반환합니다. 내가 피하고 싶은 문제는 동일한 사이트의 두 명의 사용자가 모두 정확히 동일한 시간에 새로운 작업 주문을 입력하는 경우입니다.

나는 몇 가지 가능한 해결책이 있지만 각각의 단점을 가지고 있기 때문에 더 좋은 방법이 있는지 알고 싶다.하지만 다른 것보다 더 나을 것이고 물론 나는 새로운 것 아이디어.

1) 잠금 다른 사용자가 우리가 검색하고 우리의 가치를 삽입 한 후까지 것, 그러나의 우리가 매 분마다 작업 지시를 입력하려고 사용자의 수천 척하자 (A SiteWorkorderNum 값을 검색하지 보장 할 수있는 테이블 테이블 잠금 느린 것을 아래로?)

2) 테이블을 고정하고 사용 가능한 다음 SiteWorkorderNum를 검색하고, 데이터베이스에 삽입 나는 고유 제한 오류가 발생하면 오류를 잡아 다시 시도하려고하지 마십시오 내가 성공할 때까지. (이것은 테이블을 자유롭게 유지할 수 있지만, 동일한 사이트에 수천 명의 사용자가있는 것처럼 보이기 때문에 다중 데이터베이스 호출은 약간 비효율적입니까?)

나는 이러한 솔루션 중 하나가 효과 성능? 물론 수천 명의 사용자가 없지만 트래픽이 많은 프로젝트에서 작업 할 경우를 대비해이 설계에서 모범 사례를 적용하고 싶습니다.

답변

0

하나의 옵션은 트랜잭션을 사용하는 것입니다. 결과 삽입과 함께 SELECT MAX(SiteWorkorderNum) ... WHERE SiteID=...을 수행하면 모든 것이 작동합니다. 유일한 문제는 거래가 실패 할 수 있으며 사용자 환경에 좋지 않을 수 있다는 것입니다.

이전에 사용한 다른 구성표는 SiteIdNextWorkorderNum 열로 할당 테이블을 갖는 것입니다. 그냥 UPDATE SiteWorkorderAlloc SET @Num=NextWorkorderNum, NextWorkorderNum=NextWorkorderNum+1 WHERE SiteId=...하십시오. 그런 다음 @Num을 움켜 쥐어 다음 작업의 작업 순서 번호로 사용하십시오. 그것은 잘 작동, 유일한 사소한 단점은 workorder 번호와 삽입 사이에 충돌이있는 경우, 그 workorder 번호가 (절대 사용되지 않습니다) 손실됩니다.