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
не работает, потому что база данных не поддерживает этот уровень.
Обновление , здесь указан профиль тупика