Транзакция изоляции моментального снимка прервана из-за конфликта обновления для выбранных строк
Транзакция изоляции моментального снимка прервана из-за конфликта обновления. Вы не можете использовать изоляцию моментальных снимков для прямого или косвенного доступа к таблице в базе данных, чтобы обновить, удалить или вставить строку, которая была изменена или удалена другой транзакцией. Повторите транзакцию или измените уровень изоляции для оператора update / delete.
Я читал другие проблемы, упомянутые здесь, но моя немного отличается, я просто пытаюсь прочитать некоторые данные с помощью оператора 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
1 ответ
Оказывается, я не могу выполнить обновление таблицы, которая используется в транзакции изоляции моментального снимка. Я разделил свою таблицу на две части, переместил столбцы, которые нужно обновить во второй таблице, и не добавил никаких связей FK. Это решило проблему.