У меня есть многопоточный процесс планировщика (.NET), который вызывает хранимую процедуру, которая должна извлекать данные со связанного сервера и, в конечном итоге, вставлять данные в локальную таблицу. Я не использую явно какие-либо транзакции - меня не беспокоит сбой процесса, так как я могу просто перезапустить его. Кроме того, я хочу избежать сложности распределенных транзакций (MSDTC).
Я сталкиваюсь с тем, что большую часть времени в процессе .NET я получаю следующую ошибку:
The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server "XXXX" was unable to begin a distributed transaction.
OLE DB provider "SQLNCLI11" for linked server "XXXX" returned message "No transaction is active.
Когда я выполняю хранимую процедуру из SQL Server Management Studio, ошибка не возникает. Я пытался отследить, чем выполнение SSMS отличается от .NET, и обнаружил несколько случаев, когда процесс .NET НЕ получал ошибку. Но даже при этом я не могу провести различие между тем, когда это терпит неудачу, и когда это не так.
Для чего бы это ни стоило, я добавил некоторую регистрацию в процедуру для записи @@trancount
, которая всегда регистрируется как 2. Я могу понять одну неявную транзакцию для покрытия оператора INSERT
для сохранения журнала, но я не могу учитывать вторую. Что бы это ни стоило, моя хранимая процедура фактически вызывает вторую процедуру, которая обращается к связанному серверу - не уверен, что это имеет значение. Все это говорит о том, что @@trancount
возвращает 2 даже в случае успеха (и независимо от того, вызывается ли он из SSMS или .NET).
Администратор баз данных изменил свойства связанного сервера, чтобы убедиться, что «включить продвижение распределенных транзакций» не соответствует действительности. Что еще я должен попробовать? Спасибо!