Транзакция изоляции моментального снимка прервана из-за конфликта обновления для выбранных строк

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

Другие вопросы по тегам