Транзакция была заблокирована для ресурсов блокировки с другим процессом и была выбрана в качестве жертвы тупика. Перезапустите транзакцию - PullRequest
0 голосов
/ 19 ноября 2018

ASP.NET MVC project 4.5 и EntityFramework Database First.

У меня есть какая-то команда, которая будет срабатывать, когда пользователь нажимает кнопку

using (TransactionScope scope = new TransactionScope())
{
    using (DbContext context = new DbContext())
    {
      //update about 3 tables
      scope.Complete();
    }
}

С другой стороны, яесть другой метод, который ТОЛЬКО читает (не обновляя ничего) данные из одной из предыдущих таблиц, но он работает каждые 2 секунды (есть таймер, который запускает этот процесс чтения).

Проблема : иногда (не всегда) я получаю следующее исключение из процесса чтения (не процесса обновления).

System.Data.SqlClient.SqlException: транзакция (ID процесса 57) заблокирована при блокировкересурсы с другим процессом и был выбран в качестве жертвы тупика.Повторите транзакцию.

, хотя процесс обновления работает правильно и успешно, и хотя процесс чтения завершается неудачно (иногда не всегда), что не имеет большого значения, так как он будет запрошен снова через 2 секунды иуспех в то время.Боюсь, что я делаю это неправильно, есть ли какой-нибудь совет полностью избавиться от этого исключения?

ПРИМЕЧАНИЕ: я не получал это исключение раньше, я начал получать это исключение, когда началиспользовать обновление TransactionScope.

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

Я создал транзакцию, как показано ниже:

new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions()
        {
            IsolationLevel = IsolationLevel.RepeatableRead
        })

ПРИМЕЧАНИЕ: уровень SnapShot не работает, потому что база данных не поддерживает этот уровень.

Обновление , здесь указан профиль тупика

enter image description here

...