Транзакция изоляции моментального снимка прервана из-за конфликта обновления. Вы не можете использовать изоляцию моментального снимка для прямого или косвенного доступа к таблице в базе данных для обновления, удаления или вставки строки, которая была изменена или удалена другой транзакцией. Повторите транзакцию или измените уровень изоляции для оператора обновления / удаления.
Я прочитал другие упомянутые здесь проблемы, но моя немного отличается, я просто пытаюсь прочитать некоторые данные с помощью оператора select, но если эти выбранные строки обновляются за пределами с помощью другой транзакции, я получаю указанную выше ошибку конфликта.
Если я попытаюсь использовать LDPLOCK
подсказку, она сработает, но замедлит ее. какое-нибудь решение для этого?
Практический пример ниже.
using (SqlConnection cn = new SqlConnection(connectionString))
{
await cn.OpenAsync();
using (SqlTransaction tran = cn.BeginTransaction(System.Data.IsolationLevel.Snapshot))
{
"select top 10 * from Employee where type = 1"
}
}
Теперь, если я также выполняю обновление таблицы сотрудников до того, как будет выполнена вышеуказанная фиксация транзакции, это вызовет указанную выше ошибку. Я не уверен, почему, поскольку это только оператор выбора. Я читал блоги Microsoft, что это создаст проблему, но нигде не нашел решения.
update employee set IsActive = 1 where type = 1
SELECT
, и ничто другое в транзакции не получает ошибку конфликта обновления? Это не соответствует принципу работы изоляции снимков. Можете ли вы свести это к ситуации, которую могут воспроизвести другие? - person Jeroen Mostert   schedule 25.01.2019update employee set IsActive = 1 where type = 1
? - person Sairam Cherupally   schedule 28.01.2019