-2

この非常に基本的なストアド プロシージャを作成しました。これは、ユーザーが特定の種類のアイテムを作成したときに cms によって呼び出されます。ただし、同じデータで作成された cms アイテムごとに 2 つの行を取得する場合があるようですが、1 つずれていSourceIDます。私はSQLの仕事をあまりしないので、これは基本的なことかもしれませんが、これが起こらないようにするために、ストアドプロシージャでテーブルを明示的にロックする必要がありますか?

ストアド プロシージャのコードは次のとおりです。

BEGIN
    SET @newid = (SELECT MAX(SourceID)+1 from [dbo].[sourcecode])

    IF NOT EXISTS(SELECT SourceId from [dbo].[sourcecode] where SourceId = @newid)
        INSERT INTO [dbo].[sourcecode]
            (
                SourceID,
                Description,
                RunCounts,
                ShowOnReport,
                SourceParentID,
                ApprovedSource,
                Created
            )
        VALUES
            (
                @newid,
                @Desc,
                1,
                @ShowOnReport,
                1,
                1,
                GetDate()
            )

    RETURN @newid
END

複製されたデータの例を次に示します (無関係な列がいくつかありません)。

SourceId    Description Created
676         some text   2012-10-17 09:42:36.553
677         some text   2012-10-17 09:43:01.380
4

4 に答える 4

1

これはSPとは何の関係もないと確信しています。Oded が述べたように、これはコードの結果である可能性があります。重複を生成できるストアド プロシージャには何も表示されません。また、MAX(SourceId) + 1 も使用しません。とにかく常に新しいソース ID が必要な場合は、「自動インクリメント」を使用してみませんか?

于 2012-10-17T14:14:13.293 に答える
0

コメントで言われているように、あなたの問題はコード層にあると思います。どのデータも制約に違反していないようです。挿入を実行する前に、同じユーザーが「最近」同じデータを送信したかどうかを確認する必要がある場合があります。

于 2012-10-17T14:12:56.540 に答える
0

ストアド プロシージャを使用する場合は、ロックを使用できます。私が使用するものでは、通常使用しますWITH (ROWLOCK)。ロックは、データの整合性を確保するために使用されます。単純な Google は、ロックを使用する理由について多くの情報を表示する必要があると思います。

しかし、他のコメンテーターが言ったように、コードにも何もないかどうかを確認してください。同じメソッドを 2 回呼び出しているものはありますか? 更新を行っているメソッドを参照する「イベント」はありますか?

于 2012-10-17T14:06:52.657 に答える
-2

ボタンを 2 回クリックするなどして、同じ関数を 2 回呼び出しているため、説明が重複している可能性があります。

IDENTITYSourceID 列で を使用し、Scope_Identity()関数を使用する必要があります

何らかの理由でそれを行いたくない場合は、分離レベルをSerializable

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
    SET @newid = ....


COMMIT 
于 2012-10-17T14:06:54.547 に答える