2013-02-18 2 views
0

데이터베이스에서 주어진 UniqueID이라는 테이블을 UniqueIDStore라고합니다. 응용 프로그램이 고유 ID를 필요로 할 때, 테이블에서 다음 ID 값을 가져 오는 경우가 중복되는 경우가 있습니다.

  1. 지난 UniqueID
  2. 하여 테이블
  3. 증가 UniqueIDStore에서 저장 최신 UniqueIDUniqueIDStore 표를 얻으, 응용 프로그램은 저장 프로 시저를 다음 실행할 것이며, 그것은 다음과 같은 일을한다.

응용 프로그램이 다른 데이터베이스 연결/자바 프로세스에서이 저장 프로 시저를 실행하면, 그것은 나를 ID의 언젠가 중복 반환, 난 이유를 모르겠어.

UniqueIDStore 테이블 :

CREATE TABLE [dbo].[UniqueIDStore](
    [UniqueId] [bigint] NOT NULL 
) ON [PRIMARY] 

저장 프로 시저는 다음과 같습니다

CREATE PROCEDURE [dbo].[GET_UniqueID] @blockSize int = 1 
AS 
    DECLARE @uniqueId BIGINT; 
    DECLARE C1 CURSOR local FOR SELECT UNIQUEID FROM UniqueIDStore FOR UPDATE OF UNIQUEID; 
    OPEN C1; 
    SELECT UNIQUEID FROM UniqueIDStore; 
    FETCH C1 INTO @uniqueId; 
    UPDATE UniqueIDStore SET UNIQUEID = @uniqueId + @blockSize; 
    CLOSE C1; 
GO 

내가 SQL 서버 전문가가 아니다; 누군가가 요청을 동기화하는이 고정 저장 프로 시저에서 나를 도울 수 있습니까?

+3

ID 열을 찾습니다. 2012 년에는 시퀀스를 볼 수도 있습니다. 이 아이디어에 머물렀다면 "select (select unique (UniqueIDStorage에서 최대 (UNIQUEID)) +1)"을 시도하십시오. – muhmud

+2

내장 된 옵션 인 'IDENTITY' 대신 왜 이것을 사용 하시겠습니까? 나는 이것이 항상 작동하는 것을 보지 못합니다. 동시 요청, 트랜잭션 롤백, 잠재적으로 더러운 읽기 등과 같은 많은 요소가 있습니다. – Bridge

+0

오라클 백그라운드에서오고 있습니까 (next-sequence (next val))? – granadaCoder

답변

0

저장 프로 시저가 트랜잭션을 사용하지 않으므로 다른 값을 읽은 후에 다른 값을 읽지 않을 수도 있지만 새 값을 저장하기 전에는 값을 읽을 수 없습니다.

의 SQLServer에서

이 같은 기본 키 생성을 처리하기위한 ID를 사용 할 수 있습니다

insert into something values ('something'); 
insert into something values ('something else'); 

을 아마 이런 걸 얻을 :

create table something (
    id identity int, 
    something varchar(50) 
); 

을 그런 다음이 작업을 수행 할 수 있습니다

| id | something  | 
| 1 | something  | 
| 2 | something else | 
+0

OP가 ** 거래 **를 사용하고 있지 않다는 사실이 아닙니다 - 사실 (a) 커서를 사용하는 것은 완전히 필요하지 않습니다. (b) 그는 동시로드 하에서 안전하지 않은 실행으로 이어질 수있는 두 개의 분리 된 단계 ('UPDATE' 이전에'SELECT')를하고 있습니다 –

관련 문제