У меня есть сценарий, в котором я запускаю несколько SQL-запросов за определенный период времени. В течение всего этого сценария есть вероятность, что оператор Update будет выполняться одновременно с оператором Select, влияющим на ту же таблицу. Когда это произойдет, мой объект SqlDataReader запускает запрос Select и не возвращает строк. Тем не менее, повторная попытка запроса Select приведет к получению правильных данных. Оператор Select должен реалистично никогда не возвращать данные.C# SqlDataReader из оператора Select иногда не возвращает строк, когда оператор обновления работает одновременно
Хотя я могу повторить запрос после неудачного чтения, чтобы получить результаты, я хотел бы избежать этого столкновения в первую очередь или, по крайней мере, иметь возможность различать фактическое чтение строк и возникшую ошибку столкновения. При изучении объекта SqlDataReader единственное другое свойство, которое говорит мне, что чтение не удалось, заключается в том, что для HasRows установлено значение false, что недостаточно для того, что я ищу здесь. Кроме того, попытка чтения просто возвращает false и не вызывает ошибку, потенциально говорящей о том, почему чтение не удалось.
До сих пор я пробовал устанавливать блокировки для запросов Select и Update, но у меня не было такой удачи. В идеале оператор Update имеет блокировку, которая будет очереди, а не блока, выбор запросов выполняется до завершения транзакции. Я попробовал несколько различных вариантов блокировки, но один пример, который я попытался было это:
update <Tablename> with (TABLOCKX, HOLDLOCK) set ...
Это не остановить столкновения, как я ожидал, так это то, где я застрял.
Является лучшим методом здесь, чтобы просто повторить попытку, если я знаю, что никогда не должно быть пустое чтение, или, может быть, лучший метод, поскольку я предлагаю использовать SQL-блокировки?
При обновлении строки ваше отборного заявление должно быть в ожидании освобождения блокировки. Если вы не используете подсказки в своем обновлении и ваше чтение уже изменило бы это поведение. –
В настоящее время единственными операторами блокировки, которые у меня есть, являются те, что указаны в моей инструкции по обновлению. –