Serviceを読んで理解し、同意したものとみなします。スタック・オーバーフローはプログラマーとプログラミングに熱心な人のためのQ&Aサイトです。2,557件0SQLserverでレコードをinsertしたいのですが、その際の主キーをどうやって設定するか悩んでいます。今までmax(主キー)+1でやっていたのですが、この方法だと複数プロセス同時にinsertがかかったときに同じ主キーを登録しようとしてしまうことがあります。調べたのですが、TransactionScopeというのがありそれで排他処理できるようです。個のリソースで他のプロセスとデッドロックして、このトランザクションがそのデッドロックの対象となりました。トランザクションを再実行してください。」という例外が起きてしまい上手くいきません。以下試したコード(C#)です。同じプログラムをほぼ同時に起動したところ上記の例外が発生しました。}}排他制御を上手く働かせて同じidを登録しないようにするにはどうすればいいでしょうか。個の銅バッジ多くのRDBMSではシーケンス番号生成機能を備えており(SQL標準なようです)、この機能でIDを生成することも多いです。Serverでも該当機能を備えているようですので、今回、こちらが利用できる可能性もあるかと考えます。属性を付与するのが軽量でお勧めです。|0問題の例外はデッドロックを検知して正しく発生しています。必要なのは、この例外が発生した場合に処理をリトライするような実装になります。件のエラーのSqlException.Numberは1205ですので、以下のような条件でキャッチを行います。}}リトライ方法は要件によると思いますが、もっとも単純な方法としてはforループによるものがあります。...のようなSQLに書き直すべきです。|0IsolationLevel.Serializableの概念を説明します。x.id);にて最大値を得るわけですが、その際、当然ながら全レコードを参照します。トランザクションでは参照した全レコードに対して共有ロックを取得します。world.");にて排他ロックを取得してからINSERTが実行されます。共有ロックと排他ロックは次の性質があります。別セッションで共有ロック中に新たに排他ロック不可、解除待ちする別セッションで排他ロック中に新たに共有ロック不可、解除待ちする別セッションで排他ロック中に新たに排他ロック不可、解除待ちするこの通りロックは解除待ちを行うだけの存在で、それ自体がデッドロックを引き起こすものではありません。このロックの性質を踏まえて質問のコードの動作を検証すると次の状態が存在することがわかります。world.")にて排他ロックを獲得しようとすると、どちらのセッションも共有ロックの解除待ちを行います。これがデッドロックです。以上のデッドロック発生のメカニズムを踏まえた上で、対策を考えます。整合性レベルを下げる整合性レベルを下げてIsolationLevel.ReadCommittedを使用すると共有ロックを保持し続けなくなります。これにより排他ロックを獲得できるようになるためデッドロックは発生しなくなり、本来の主キー重複エラーが発生可能になります。重複エラーが発生したらリトライしてください。参照(SELECT)と挿入(INSERT)を同時に行うTableAdapterの機能を使わず、直接SQL文を記述してください。テーブル設計を変更し、自動的に採番するIDENTITYプロパティを使用します。yukihaneさんが提案されているシーケンス番号とは別物です。|回答スタック・オーバーフローに参加してくれて、ありがとうございます!質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)さらにサポートが必要な場合このヘルプを参考してください。“回答を投稿”をクリックすることで利用規約、プライバシーポリシー、及びクッキーポリシーに同意したものとみなされます。タグが付いた他の質問を参照するか、自分で質問をする。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。