2016-12-12 13 views
0

私は長い間、ここで何が問題になっているかを調べようとしています。私は1つのINSERTを持っているストアドプロシージャを持っています。多くのレコードで、この挿入のscope_identityが正常に返されました。しかし、ほんのわずかのためにnullを返すので、次の挿入はエラーで失敗します(この値は他のテーブルではnullにできません)。SCOPE_IDENTITY()は、レコード数が少ない場合にのみnullを返します。

ログには、このストアドプロシージャの複数の要求が同時に(1 ms)入ってきたことがあります。

私は複数のリクエストが入って来たと同時に、テーブル内で一意のIDのギャップを見るようにIDが生成されていると思います。

ことがSCOPE_IDENTITYですべての問題(だろうか)?

+0

私は、並行性が問題になる疑う:

SQLトランザクションのためにこの便利なリンクを使用します。 'SCOPE_IDENTITY()'は、おそらくエラーのために行が挿入されていなければ 'NULL'のままです。 –

+0

右。私の2番目の挿入ステートメントは、私のログにあるエラーをスローします。しかし、最初のインサートはエラーを投げたことはありません。しかし、scope_identityはnullです。おそらく私はinsertステートメントをもっと詳しく見る必要があります。 – Shrav

+0

Scope_identityは、現在のスコープ内の最後のinsert文のIDを格納します。最後の挿入ステートメントが成功しませんでした。必要に応じて、挿入後にスコープIDを取得します。 –

答えて

1

IDENTITY列に隙間があり、その隙間が列の「IDインクリメント」プロパティ値と一致する場合、自動インクリメント値が挿入中に適用されるようにプルされましたが、トランザクションが完了する前に挿入に間違っている、例えば外部キー制約。次回のレコードに対して次の自動インクリメント値が取得されると、トランザクションが失敗しても永久に消失します。挿入操作中にエラーを探す必要があります。

+0

null値にnull値を挿入しようとすると、Insertが失敗するように見えます。私にこれを見ていただきありがとうございます。 – Shrav

-1

多くのリクエストが同じテーブルに同時にアクセスしてレコードを挿入するという私のウェ​​ブアプリケーションでは同じ問題がありました。あなたの操作が速すぎるために "SQLトランザクション"を使用する必要があります。実行すると、テーブルを実行しているコマンドを挿入すると、ロックされます。 SQL Transaction

関連する問題