У меня есть две базы данных A
и B
. Они оба хранятся в одном экземпляре базы данных. Я создал связанный с петлей сервер на экземпляре.Сделка с соединением с обратной связью с обратной связью
База данных A
содержит одну таблицу dbo.Users
и одну хранимую процедуру, обновляющую dbo.Users
таблицу. В базе данных B
У меня есть запрос, который делает две вещи:
- выполнение хранимой процедуры из базы данных
A
которая обновляетdbo.Users
таблицу. - Выберите данные из
dbo.Users
через связанный сервер.
BEGIN TRANSACTION
EXEC [LinkedServer].A.dbo.UpdateUser
select * from [LinkedServer].A.dbo.Users
ROLLBACK TRANSACTION
Когда я пытаюсь выполнить эту хранимую процедуру, я получаю следующее исключение только тогда, когда я поставил тайм-аут на связанном сервере; в других случаях запрос не заканчивается:
Msg 3971, Level 16, State 1, Line 1 The server failed to resume the transaction. Desc:3900000002.
Причина этой проблемы заключается в том, что выполнение хранимой процедуры [LinkedServer].A.dbo.UpdateUser
создает транзакцию, которая не позволяет сделать отборное заявление.
Так что я решил добавить WITH (NOLOCK)
, как показано ниже:
BEGIN TRANSACTION
EXEC [LinkedServer].A.dbo.UpdateUser
select * from [LinkedServer].A.dbo.Users WITH (NOLOCK)
ROLLBACK TRANSACTION
Тогда я получаю это исключение:
OLE DB провайдер "SQLNCLI11" для связанного сервера "LinkedServer" возвращается сообщение «Неизвестная ошибка ».
Поставщик OLE DB «SQLNCLI11» для связанный сервер «LinkedServer» возвращенное сообщение «Тайм-аут запроса истек».
Msg 7311, уровень 16, состояние 2, строка 4 Не удается получить схему набор строк «DBSCHEMA_TABLES_INFO» для поставщика OLE DB «SQLNCLI11» для связанного сервера «LinkedServer». Поставщик поддерживает интерфейс, но возвращает код сбоя, когда он используется.
Я нашел информацию об этом исключении на microsoft support page. Существует информация о том, что эта ошибка возникает при попытке запуска распределенных запросов с 64-разрядного клиента SQL Server на связанный 32-разрядный SQL Server. В моем случае это не имеет смысла, потому что у меня есть связанный loopback-сервер.
Приведенные выше ошибки не возникают при развертывании баз данных на отдельных экземплярах SQL-сервера. Любые идеи о том, как опустить блокировки или изменить T-SQL, чтобы не получить исключения при использовании связанного с петлей сервера?
Нужна ли вам ссылка на связанный сервер? Почему бы не ссылаться на другую базу данных «database_name.schema_name.table_name'? –