0

テーブルに挿入するストアドプロシージャがあります(主キーではないID列があります。PKは最初に日付/時刻を使用して挿入され、一意の値が生成されます)。

次に、SCOPEIDENTITY()を使用して値を挿入します。次に、この値に基づいて主キーフィールド値を生成するロジックがあり、これがテーブルに更新されます。

状況によっては、ストアドプロシージャが複数のプロセスによって同時に呼び出され、「PRIMARYKEY制約の違反...」エラーが発生する場合があります。

これは、ID列が複数のレコードに同じ番号を挿入できることを示しているように見えます。

最初の質問-これはどのように可能ですか?

2番目の質問-それを停止する方法...現在エラー処理がないので、いくつかのtry / catchロジックを追加します-しかし、適切に対処するために問題を完全に理解したいと思います

4

3 に答える 3

2

エラーメッセージを詳しく見てください。

PRIMARYKEY制約の違反...

そして、あなたが言ったことを考えると:

主キーではないID列がある場合-PKは最初に日付/時刻を使用して挿入され、一意の値を生成します

主キーではないため、問題はID列とは関係がないように見えますが、日付/時刻のアプローチでは一意の値が生成され、挿入しようとすると失敗する可能性があります。

ID列を主キーとして使用していない理由はありますか?

于 2010-05-17T09:16:35.140 に答える
1

代わりにIDENT_CURRENT('tablename')を使用する必要があると思います。

SCOPE_IDENTITY()は、現在のセッションで作成された最後のID値を返します。

IDENT_CURRENTは、スコープとセッションによって制限されません。指定されたテーブルに制限されます。

http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

ここであなたはあなたの問題について読むことができます

http://web.archive.org/web/20130605142906/http://connect.microsoft.com/SQLServer/feedback/details/328811/

並列処理に関する別の有用な記事

https://sqlblog.org/2009/03/21/six-reasons-you-should-be-nervous-about-parallelism

幸運を!

于 2010-05-17T09:15:04.173 に答える
0

PKは、一意の値を生成するために日付/時刻を使用して最初に挿入されます

問題を引き起こしているのはアイデンティティだと確信していますか?現在の日付/時刻の値をPKの初期値として挿入し、それが2つの異なるスレッド/プロセスによって同時に実行される場合、同じ値を取得する可能性があります。

于 2010-05-17T09:17:48.653 に答える