사용자가 특정 번호를 예약하는 중요한 지점이있는 ASP.NET 웹 응용 프로그램이 있습니다.릴리스가 보장 된 SQL Server 잠금 테이블
무슨 일입니다 :
응용 프로그램이 다음을 필요로 예를 들어,이 번호를 읽고 그것으로 약간의 바코드를 계산 3044, 즉 'last_box_number'가 저장되어있는 테이블이 있습니다
각 번호는 3045에서 3144까지입니다.
응용 프로그램은 데이터베이스에 이러한 데이터를 추가 데이터와 함께 저장하고 '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'를 얻으십시오
새 레코드의 양이 미리 알려지면 좋겠지 만 때때로 변경 될 수 있으며 참조 번호가 일관되고 고유해야합니다.
내게는 테이블을 전혀 잠그지 않아도되는 대체 솔루션이 있어야합니다. 그러나 내가 대답 할 수 있도록 귀하의 요구 사항을 완전히 이해할 수는 없습니다. 테이블과 더미 데이터에 대한 스키마가있는 간단한 예제를 추가 할 수 있다면 좀 더 자세히 살펴 보도록하겠습니다. – Tanner
일단 값이 예약 되었으면 예약을 취소 할 수 있습니까? 그런 일이 일어난다면 그 범위는 어떻게 될까요? 다시 사용할 수 있어야합니까? 아니면 앞으로 무시되어 상자 번호 목록에 공백이 생길 수 있습니까? – Tanner
더 나은 정보를 제공하는 더 나은 솔루션의 가능성을 배제한다면 응용 프로그램 잠금 ([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