문제

나는 정체성 분야를 알고 있지만 문제를 해결하기 위해 하나를 사용할 수 없다는 느낌이 들었습니다.

여러 고객이 있다고 가정 해 봅시다. 각 클라이언트에는 여러 주문이 있습니다. 각 고객은 주문 번호를 순차적으로 구체적으로 가져와야합니다.

예제 테이블 구조 :

Orders:
OrderID | ClientID | ClientOrderID | etc...

이 테이블의 예제 행은 다음과 같습니다.

OrderID | ClientID | ClientOrderID | etc...
1 | 1 | 1 | ...
2 | 1 | 2 | ...
3 | 2 | 1 | ...
4 | 3 | 1 | ...
5 | 1 | 3 | ...
6 | 2 | 2 | ...

순진한 방법은 모든 클라이언트에 대한 Max ClientOrderID를 취하고 인서트에 해당 값을 사용하는 것이지만 동시성 문제가 발생합니다. 나는 거래를 고려하고 있었지만 이것에 가장 많이 사용될 수있는 가장 광범위한 격리 범위가 무엇인지 잘 모르겠습니다. LINQ에서 SQL을 사용하지만 관련이없는 느낌이 있습니다.

도움이 되었습니까?

해결책

내가 틀렸다면 누군가 나를 교정하지만 max () 호출이 삽입과 같은 단계에있는 한, 동시성에 문제가 없습니다.

그래서 당신은 할 수 있습니다 ~ 아니다 하다

select @newOrderID=max(ClientOrderID) + 1
from orders
where clientid=@myClientID;

insert into ( ClientID, ClientOrderID, ...)
values( @myClientID, @newOrderID, ...);

하지만 당신 ~할 수 있다 하다

insert into ( ClientID, ClientOrderID, ...)
select @myClientID, max(ClientOrderID) + 1, ...
from orders
where clientid=@myClientID;

OrderId가 신원 열이라고 가정합니다.

다시 말하지만, 내가 이것에 틀렸다면 알려주세요. 바람직하게는 URL이 있습니다

다른 팁

저장소 패턴을 사용하여 주문을 처리하고 각 특정 클라이언트 주문 번호의 수를 제어하도록 할 수 있습니다. OrderRepository를 올바르게 구현하면 동시성을 제어하고 데이터베이스에 저장하기 전에 순서를 숫자로 제어 할 수 있습니다 (DB가 숫자를 설정하지 않고 저장소에 숫자를 설정하십시오).

저장소 패턴 : http://martinfowler.com/eaacatalog/repository.html

한 가지 가능성은 (이 작업을 좋아하지는 않지만) 각 공급 업체에 대해 가장 큰 주문 번호를 알려주는 조회 테이블을 갖는 것입니다. 트랜잭션 내부에서 VendorOrderNumber에서 가장 최근의 것을 가져오고 새 주문을 저장하고 VendorOrderNumber의 값을 증가시키고 거래를 커밋합니다.

이것은 데이터를 저장하는 이상한 방법이지만 필요하다고 가정하면 사용할 수있는 내장이 없습니다.

Max (ClientOrderId)에 대한 귀하의 제안은 간단하고 구현하기 쉽습니다 (John MacIntyre의 조언을 따르십시오). 아마도 수천 명의 주문이있는 테이블에서는 용납 할 수 있습니다. 테이블이 성장함에 따라이 접근법은 물론 느려질 것입니다.

Nick Devore의 조회 테이블에 대한 제안은 구현하기가 약간 지저분하지만 데이터 성장의 영향을받지 않습니다.

ClientOrderId가 실제로 필요한 위치/시기에 따라 필요할 때 ID를 계산할 수 있습니다.

SELECT *,
ROW_NUMBER() OVER(ORDER BY OrderID) AS ClientOrderID
FROM Orders
WHERE ClientID = 1

이것은 clientOrderID가 OrderID와 동일한 순서라고 가정합니다. 실제로 ID를 지속하지 않으면 다른 어떤 것의 열쇠로 사용하는 것이 어색합니다. 이 접근법은 데이터 성장의 영향을 받아서는 안됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top