Код: Выделить всё
public async Task InsertReportRecord(Guid consultantReportId, string code, string studyId, string serverLocation)
{
using (var transaction = _reportRepository.BeginTransaction(IsolationLevel.RepeatableRead))
{
try
{
var record = new Report()
{
ConsultantReportId = consultantReportId,
Code = code,
StudyId = studyId,
RequestedOnUtc = DateTime.UtcNow,
ServerLocation = serverLocation
};
_reportRepository.Add(record);
await _reportRepository.SaveAsync();
transaction.Commit();
}
catch (Exception e)
{
_logger.Error("DB Transaction error, rolling back: " + e);
transaction.Rollback();
}
}
}
То есть:
< ul>
[*]Не удалось вставить строку с идентификатором 123, выдается повторяющаяся ошибка PK (ID = 123) (ожидается в настоящее время)
< li>Попытка вставить совершенно другую строку с идентификатором 456. впоследствии это также терпит неудачу и выдает повторяющуюся ошибку PK (ID = 123), это та часть, которую я не ожидал
Это продолжается часами, пока в конечном итоге ошибка не зафиксируется на другом идентификаторе, с которым произойдет сбой.
Я понимаю, что корень этой проблемы должен заключаться в том, чтобы в первую очередь избегать вставки дубликатов, и я изучаю это. Но я по-прежнему считаю, что этот фрагмент кода должен быть достаточно надежным, чтобы игнорировать ошибку, не допуская сбоев во всех будущих вставках.
Я проверил, как этот метод написан с логикой отката транзакции. многочисленные посты и статьи, и вроде бы так и должно быть, но, должно быть, я что-то упускаю, если это происходит. Любая помощь приветствуется!
Подробнее здесь: https://stackoverflow.com/questions/793 ... e-rollback