Как восстановить из взаимоблокировки исключение во время SqlDataReader.Читать()

журналы событий для моего приложения .NET показывают, что он иногда взаимоблокировки при чтении из Sql Server. Обычно это происходит очень редко, так как мы уже оптимизировали наши запросы, чтобы избежать взаимоблокировок, но иногда они все еще происходят. В прошлом у нас были некоторые тупики, которые происходят при вызове

2 ответа:

вся ваша транзакция теряется в тупике. Вы должны перезапустить с нуля, от путь над уровнем, где вы читаете устройство чтения данных. Вы говорите, что читаете некоторые записи, а затем обновляете их в цикле. Вы должны перезапустить с чтением снова записи:

function DoWork() {
  using (TransactionScope scope = new TransactionScope(...)) {
    cmd = new SqlCommand("select ...");
    using (DataReader rdr = cmd.ExecuteReader ()) {
        while(rdr.Read()) {
          ... process each record
        }
    }
    scope.Complete ();
  }
}

вы должны повторить весь DoWork звоните:

retries = 0;
success = false;
do {
 try {
  DoWork ();
  success = true;
 }
 catch (SqlException e) {
   if (can retry e)  {
     ++retries;
   }
   else {
     throw;
   }
 }
} while (!success);

не могли бы вы рассмотреть возможность использования наборов данных или таблиц данных вместо DataReaders?

мой страх здесь, хотя я не уверен, заключается в том, что чтение, бросающее ошибку, полностью отбросит эту запись. Вы можете проверить это в контролируемой среде, где вы можете вызвать ошибку и посмотреть, перечитывает ли она запись или просто отбрасывает ее.