문제

SQL Azure 연합이 ID 속성 또는 시퀀스를 지원하지 않음을 고려하여 레코드를 삽입 할 때 순차적 인 번호를 생성하는 효율적인 방법은 무엇입니까?

예를 들어,이 열이있는 테이블이 주어졌습니다.

CREATE TABLE [dbo].[Orders] (
    [TenantId] [uniqueidentifier] NOT NULL,
    [OrderId] [uniqueidentifier] NOT NULL,
    [OrderNumber] [int] NOT NULL
    CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED (
        [TenantId] ASC,
        [OrderId] ASC
    )
) FEDERATED ON ([FederationKey] = [TenantId])
.

주어진 세입자에 대해 삽입 된 각 주문에 대해서는 OrderID가 증가해야합니다. 예를 들어, 텐란트의 경우 OrderID는 1, 2, 3 ... 및 임차인 B orderID가 독립적 인 서열에서도 1, 2, 3도 될 것입니다. 이상적으로 틈이 없어야합니다.

TenantId 및 orderID는 기본 키의 구성 요소입니다. 그들의 가치는 응용 프로그램에 의해 설정되며 시퀀스 생성 문제와 관련이 없습니다. OrderId만이 사업을 의미하는 순차적 인 수가 있습니다. 또한 Tenantid는 연합의 배포 키입니다.

이 MSDN 블로그 기사 옵션 1에서는 시퀀스를 고정시키고 분리 된 트랜잭션에서 저장 프로 시저를 사용하여 시퀀스를 증가시킵니다. 각 세입자는 시퀀스의 마지막 사용 된 값을 보유하고있는이 테이블에 대한 레코드가 있습니다.

확장 성, 경합, 자원 잠금을 고려한 최적의 접근법이 될 것입니다. SQL Azure 연합의 한계를 고려한 다른 유용한 트릭은 무엇입니까?

도움이 되었습니까?

해결책

여기에 2 개의 추가 아이디어가 있습니다.

접근 방식은 비즈니스 시나리오에서 가능한 경우이 비동기를 만들기 위해이 필드를 만들 수있는 별도의 프로세스 업데이트를 수행하는 것입니다. OrderNumber 필드 가이 접근 방식에 대해 NULL 값을 허용해야합니다. 어떤 순서가 가장 먼저 왔는지 알고 있으므로 올바른 주문 번호를 가져 오도록, 또한 삽입 된 데이트 필드를 추가 할 것입니다. 비동기 처리는 이중 중복성을 위해 여러 작업자 역할을 수행하는 경우 더 복잡 해지면 각 프로세스가 작업중인 레코드 자체를 할당해야합니다 (소유 필드가 필요함). 중에 동시성 테스트를 추가해야합니다. 각 프로세스가 자체 레코드에서 실행 중이며 프로세스가 충돌하지 않으면 고아를 남겨 두지 않도록하기 위해 각 프로세스가 자신의 레코드를 실행하고 레코드의 할당이 만료되도록하기위한 업데이트가 갱신됩니다 (할당 필드가 필요함). 정말로 사소한 것이 아닙니다 ...

그리고 나서 당신은 가난한 사람의 접근을 가지고 있습니다 ... 별들이 자신을 잘 정렬 할 때 당신이 필요로하는 모든 것일 수 있습니다. 낙관적 인 동시성 방식을 기꺼이 갖도록 기꺼이 한 경우 삽입 중에 다음 번호를 사용해보십시오 (주어진 TenantId 및 orderID에 대해 Max orderNumber 먼저 선택)을 선택한 다음 삽입물을 수행하십시오. 삽입이 실패하면 (TenantId에 고유 한 인덱스를 추가 했으므로, 해당 목적을 위해 orderNumber)를 추가하면 OrderNumber에 1을 추가하십시오. 여기서 진짜 문제는 재시도 빈도 와이 접근법의 가능성이 실패하는 것입니다. 상대적으로 간소화 된 비즈니스 프로세스가있는 경우 실제로 실패하지 않을 수도 있습니다. 그러나 여러 가지 방법으로 지속적으로 주문을 추가 한 경우 이것은 받아 들일 수없는 접근 방식 일 수 있습니다.

다른 팁

시나리오에 맞출 수있는 노력은 얼마나 많은 노력이 필요할 것인지 모르겠지만,이를 살펴보고 조정할 수 있는지 확인하십시오. snowmaker - Azure 용 고유 ID 생성기(또는 다른 클라우드 호스팅 환경)

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