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

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

0 голосов
/ 12 февраля 2019

Оказывается, я не могу обновить таблицу, которая используется в транзакции изоляции моментального снимка.Я разделил свою таблицу на две части, переместил столбцы, которые нужно обновить во второй таблице, и не добавил никаких связей FK.Это решило проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...