У нас особенно странная проблема; позвольте мне установить сцену. Решение найдено, см. Ниже
У нас есть три базы данных SQL Server 2005 в качестве аргумента: Альфа , Бета и Гамма .
Существует отношение репликации, определенное между этими базами данных следующим образом:
Все три базы данных имеют таблицу с именем «AnExample» с одинаковой схемой. Репликация настроена таким образом, что Alpha является поставщиком, а две другие базы данных являются подписчиками.
- Приложение c # .Net 3.5, использующее транзакцию MSDTC (обрабатываемую TransactionScope), выполняет чтение и запись в базы данных: Alpha и Beta.
- Таблица «AnExample» в этой транзакции обновляется только на Alpha.
- MSDTC-транзакция успешно фиксируется.
- Таблица "AnExample", вероятно, обновлена в Альфа , и изменение немедленно реплицируется в Гамма
- Никаких изменений не происходит в Beta (профилировщик подтверждает, что в базе данных не происходит никаких действий), а также не возникает никаких ошибок в журналах SQL или журналах событий
- Повторный запуск того же запроса, который обновляет «AnExample» в Management Studio с теми же учетными данными, выполнен успешно (происходит репликация на Beta )
- Выполнение транзакции MSDTC. Запись в другую таблицу в Beta , затем точно такая же запись в таблицу Alpha "AnExample" с тестовым приложением, использующим основные приложения DAL, строки подключения и конфигурацию, также полностью завершается происходит репликация в Beta )
Это привело нас к мысли, что в главном приложении происходят некоторые изменения, которые не происходят изолированно.
Возможные улики / красная сельдь
Единственное различие, которое мы видим между нашими успешными тестами и фактическим запросом, используемым основным приложением, состоит в том, что уровень изоляции каким-то образом изменился. Для успешных запросов устанавливается только уровень изоляции транзакции Read Committed, тогда как в сценариях сбоя он устанавливается на сериализуемость (несмотря на отсутствие явного вызова для изменения уровня изоляции в кодовой базе или хранимых процедурах).
Мы считаем, что это в некотором роде красная сельдь, поскольку выполнение запроса с таким уровнем изоляции в Management Studio снова проходит без проблем. Но тот факт, что это разные моменты, может быть признаком другой проблемы, которую мы еще не обнаружили.
Для полноты здесь приведены настройки для запроса, который не реплицируется в бета-версию (но не в гамму).
-- network protocol: TCP/IP
set quoted_identifier on
set arithabort off
set numeric_roundabort off
set ansi_warnings on
set ansi_padding on
set ansi_nulls on
set concat_null_yields_null on
set cursor_close_on_commit off
set implicit_transactions off
set language us_english
set dateformat mdy
set datefirst 7
set transaction isolation level *serializable*
Это что-то вроде головного убора.