設定した期間にわたって複数のSQLクエリを実行しているシナリオがあります。このシナリオでは、同じステートメントに影響するSelectステートメントと同時にUpdateステートメントが実行される可能性があります。これが起こると、私のSqlDataReaderオブジェクトはSelectクエリを実行し、行を返しません。ただし、すぐにSelectクエリを再試行すると、正しいデータが受信されます。 Selectステートメントは現実的に決してデータを返すべきではありません。SelectステートメントのC#SqlDataReaderが、Updateステートメントが同時に実行されているときに行を返さない場合があります。
結果を得るために読み込みが失敗した後にクエリを再試行することはできますが、最初にこの衝突を回避するか、実際には行を読み取っていないこととこの衝突エラーの発生を区別する方法があります。 SqlDataReaderオブジェクトを調べると、読み込みに失敗した唯一の異なるプロパティは、HasRowsがfalseに設定されていることです。これは、ここで探しているものに対して十分ではありません。さらに、読み込みを試みるとfalseが返され、読み込みに失敗した理由を示すエラーは発生しません。
これまでのところ、私はSelectとUpdateの両方のクエリにロックをかけようとしましたが、そのような幸運はありませんでした。理想的には、Updateステートメントは、をブロックしないで、キューをロックするロックを持ち、トランザクションの完了後まで選択クエリが実行されることが理想的です。私はいくつかの異なるロックバリエーションを試してみましたが、私が試した一つの例では、このでした:
update <Tablename> with (TABLOCKX, HOLDLOCK) set ...
私は予想通り。これは、衝突を停止しないので、私は立ち往生午前場所です。
空の読み込みがないことがわかっている場合や、SQLロックを使用することを推奨している場合は、おそらくもっと良い方法でしょうか?
あなたのselect文を解除するロックを待機する必要がある行を更新する場合。あなたの更新でクエリのヒントを使用していない限り、この動作が変更されます。 –
現在、私が持っている唯一のロックステートメントは、私の更新ステートメントのものです。 –