2017-09-15 2 views
0

사용자가 특정 번호를 예약하는 중요한 지점이있는 ASP.NET 웹 응용 프로그램이 있습니다.릴리스가 보장 된 SQL Server 잠금 테이블

무슨 일입니다 :

  • 응용 프로그램이 다음을 필요로 예를 들어,이 번호를 읽고 그것으로 약간의 바코드를 계산 3044, 즉 'last_box_number'가 저장되어있는 테이블이 있습니다

    1. 각 번호는 3045에서 3144까지입니다.

    2. 응용 프로그램은 데이터베이스에 이러한 데이터를 추가 데이터와 함께 저장하고 'last_box_number'를 3144로 업데이트합니다. 이것은 트랜잭션 내에서 수행됩니다.

    문제는 그 3)가 다른 사용자가 동일한 기능을 수행 할 것이며, 수정되지 않은 테이블에서 3044을 읽을 것이라는 가능성이다, 그래서 읽는 'last_box_number'와 함께 테이블을 잠글 필요가 1 사이)와, 첫 번째 사용자가 실패하거나 (연결이 끊어 지거나 다른 일이 발생하면) 테이블이 잠긴 상태로 유지됩니다.

    SQL Server 잠금 메커니즘에 익숙하지 않아 제한 시간이 지나면 잠금이 해제되어야합니다.

    어쨌든, 앞서 언급 한 사항을 구현하는 가장 좋은 방법에 대한 조언은 언제나 환영합니다.

    는 UPDATE : OK, 여기에 예입니다 :

    CREATE TABLE [dbo].[sscc_numbers](
    [gs1prefix] [bigint] NOT NULL PRIMARY KEY, 
    [rangestart] [int] NOT NULL, 
    [lastnumber] [int] NOT NULL) 
    
    CREATE TABLE [dbo].[ssccs](
    [id] [bigint] IDENTITY(1,1) NOT NULL, 
    [sscc] [nvarchar](20) NOT NULL, 
    [clientid] [nvarchar](50) NOT NULL, 
    [referencenum] [int] NOT NULL, 
    ... other fields 
    

    USER1 (10 개) 숫자 (referencenum)를 예약하고 싶어 그래서 그는 예를 들어, sscc_numbers 테이블을 조회하고 'lastnumber'를 얻는다 6.

    그 다음에 사업을 시작하고 참조 번호가 7에서 16까지 인 10 개의 새로운 SSCC 번호를 생성합니다 (마지막으로 사용한 번호가 6이라고 생각 함). 그가 끝나면 그 10 개의 숫자에 대한 관련 데이터를 sscc 테이블에 삽입합니다. 그렇다면 그는 실행됩니다 update sscc_numbers set lastnumber=16 ...

    이제 시나리오를 피하고 싶습니다 - 두 번째 사용자가 user2가 sscc_numbers를 쿼리하고 user1이 사용중인 동안 sscc_numbers에서 같은 번호 6을 얻는다고 상상해보십시오. 그런 다음 user2가 완료된 후 중복 참조 번호를 사용하기 때문에 ssccs 테이블에 데이터를 삽입 할 수 없습니다.

    User1은 다른 한편으로는 연결이 끊어 지거나 너무 오래 처리되는 등의 문제가 발생할 수 있습니다. 문제가되지는 않지만 10 초에서 15 초 동안 sscc_numbers 테이블을 잠근 경우 그 후에 작업을 재설정해야합니다. 새로운 'lastnumber'를 얻으십시오

    새 레코드의 양이 미리 알려지면 좋겠지 만 때때로 변경 될 수 있으며 참조 번호가 일관되고 고유해야합니다.

  • +0

    내게는 테이블을 전혀 잠그지 않아도되는 대체 솔루션이 있어야합니다. 그러나 내가 대답 할 수 있도록 귀하의 요구 사항을 완전히 이해할 수는 없습니다. 테이블과 더미 데이터에 대한 스키마가있는 간단한 예제를 추가 할 수 있다면 좀 더 자세히 살펴 보도록하겠습니다. – Tanner

    +1

    일단 값이 예약 되었으면 예약을 취소 할 수 있습니까? 그런 일이 일어난다면 그 범위는 어떻게 될까요? 다시 사용할 수 있어야합니까? 아니면 앞으로 무시되어 상자 번호 목록에 공백이 생길 수 있습니까? – Tanner

    +2

    더 나은 정보를 제공하는 더 나은 솔루션의 가능성을 배제한다면 응용 프로그램 잠금 ([mutexes] (https://en.wikipedia.org/wiki/Semaphore_(프로그래밍) # Semaphores_vs._mutexes)을 찾고있을 가능성이 큽니다) . 이 가이드는 SQL Server 2005에 대한 것이지만 절차는 동일합니다. [SQL Server 2005의 응용 프로그램 잠금 (또는 뮤텍스) - Mladen Prajdić] (http://www.sqlteam.com/article/application-locks-or-mutexes) -in-sql-server-2005) 및 [**'sp_getapplock' ** - docs] (https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp) -getapplock-transact-sql) – SqlZim

    답변

    0

    이 문제를 처리 할 수있는 몇 가지 방법이 있습니다. 개인적으로 쇼핑 카트와 비슷한 것을 사용하는 것이 좋습니다. 사용자는 장바구니를로드하고 (인벤토리의 일부분을 일시적으로 예약 함) 실제 주문을 생성하고 실제 재고를 줄이거 나 체크 아웃하거나 ... 카트를 버려 다른 구매자가 해당 품목을 사용할 수있게합니다.

    그래서 특정 세션에 특정 상자를 예약하고 원래 세션이 트랜잭션의 마지막 단계를 커밋 할 때까지 다른 세션에서 사용할 수 없게 만듭니다 (영구적으로 사용할 수 없게 만듭니다).) 또는 롤백하면 다음 사용자의 상자 번호가 해제됩니다.