2つのselectステートメントからデッドロックが発生しています。その理由は何ですか?そして、どうすればこの問題を修正できますか?
Deadlocked processes: 11278
Victim process: 5185
Lock type: Index/(Key)
両方のクエリは同じです
オブジェクト:unicas_ux.dbo.Course、ロックモード:排他(X)、インデックス:NCIDX_Course_TermId
(@ P0 bigint)selectコース0_.TermIdをTermId17_130_1_として、コース0_.IdをId1_45_1_として、コース0_.IdをId1_45_0_として、コース0_.ConvertedGradeをConverte2_45_0 _...... courses0_.VerifiedCreditsとしてVerifie14_45_0。 dbo.Course courses0_からVerifie16_45_0_として。
デッドロックは、1つのクエリがオブジェクト(行、データページ、エクステント、テーブルなど)のロックを取得し、他のリソースがそれにアクセスしようとしたときに発生します。 SQL Serverの最小単位はデータページであり、SQLは作業中にページをロックします。したがって、はい、2つのselectステートメントでデッドロックが発生する可能性があります。
ソリューション:
スクリーンショットには情報が含まれていないため、この回答は質問に基づいています。
これがデッドロックの簡単な定義です
これは解決できない状況を作り出します。各クエリは、クエリがキャンセルされるか、接続が強制終了されるか、インスタンスがシャットダウンするまで、他のテーブルにアクセスできるようになるまで待機します。 SQL Serverはこれに気づき、そのうちの1つをdeadlock victim
として強制終了します。 Table 1
またはTable 2
は、テーブルの一部であっても、同じテーブルの一部であってもかまいません。
解決策は、クエリを同時に実行しないか、より速く実行するか、ロックを保持する時間を短くするか、クエリを変更して他のテーブルを使用しないようにすることです。
実際のクエリがないと、より具体的なアドバイスを提供することはできません。
編集:上記で指定したクエリの一部に基づいています(途中に....があるため、これがクエリ全体ではないと思います)。他に何が起こっているのか知りたい。 selectステートメントに排他ロックを要求しています。クエリヒントがないと、これはかなり珍しいことです。このトランザクションの前に追加のクエリがあるトランザクションはありますか?テーブル/インデックスの構造を教えてください。