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

Транзакция изоляции моментального снимка прервана из-за конфликта обновления. Вы не можете использовать изоляцию моментального снимка для прямого или косвенного доступа к таблице в базе данных для обновления, удаления или вставки строки, которая была изменена или удалена другой транзакцией. Повторите транзакцию или измените уровень изоляции для оператора обновления / удаления.

Я прочитал другие упомянутые здесь проблемы, но моя немного отличается, я просто пытаюсь прочитать некоторые данные с помощью оператора 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

person girish kolte    schedule 25.01.2019    source источник
comment
Ваш код на самом деле вообще не выполняет никаких операторов и не компилируется, но я предполагаю, что это просто плохой перефраз. Однако ваш сценарий неясен: вы говорите, что код, который только выполняет инструкцию SELECT, и ничто другое в транзакции не получает ошибку конфликта обновления? Это не соответствует принципу работы изоляции снимков. Можете ли вы свести это к ситуации, которую могут воспроизвести другие?   -  person Jeroen Mostert    schedule 25.01.2019
comment
Привет, я только что добавил этот код в качестве образца, чтобы воспроизвести эту проблему, вам необходимо выполнить операцию обновления в таблице, а также выполнить выбор в области транзакции в таблице, которая может быть обновлена ​​за пределами этой области транзакции   -  person girish kolte    schedule 26.01.2019
comment
@girishkolte, с каким уровнем изоляции выполняется этот запрос update employee set IsActive = 1 where type = 1?   -  person Sairam Cherupally    schedule 28.01.2019
comment
Я попробовал запрос сотрудника на обновление как с уровнем изоляции моментального снимка, так и без него, но он не работает.Если я использую readcommitted для обоих размещенных, он работает, но мне нужно, чтобы он работал с изоляцией моментального снимка.   -  person girish kolte    schedule 29.01.2019


Ответы (1)


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

person girish kolte    schedule 12.02.2019