0

UniqueIDStoreデータベースから最後に与えられたテーブルがUniqueIDあります。アプリケーションが一意のIDを必要とする場合、アプリケーションは次のストアドプロシージャを実行し、次のことを実行します。

  1. テーブルUniqueIDから最後に取得UniqueIDStore
  2. 1つインクリメント
  3. 最新のUniqueIDものをUniqueIDStoreテーブルに保存します。

アプリケーションがさまざまなデータベース接続/Javaプロセスからこのストアドプロシージャを実行すると、重複した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

私はSQLServerの専門家ではありません。誰かがリクエストを同期するためのこの修正ストアドプロシージャについて私を助けてもらえますか?

4

1 に答える 1

0

ストアド プロシージャはトランザクションを使用していないため、新しい値を保存する前に、他の誰かが同じ番号を読み取らないという保証はありません。

SQLServer では、次のように ID を使用して主キーの生成を処理できます。

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

次に、これを行うことができます:

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

おそらく次のようなものが得られます:

| id | something      |
|  1 | something      |
|  2 | something else | 
于 2013-02-18T20:43:09.903 に答える