MSSQL Ошибка 7391: OLE DB provider unable to begin a distributed transaction
- Выполнение распределенного запроса (
INSERT INTO ... EXECилиBEGIN DISTRIBUTED TRANSACTION) завершается сбоем:Msg 7391, Level 16, State 2: The operation could not be performed because OLE DB provider was unable to begin a distributed transaction. - В журнале Windows Event Log фиксируются ошибки
MSDTC Client unable to establish connection with DTC service. - Пакетные операции обмена 1С:Предприятие между узлами РИБ зависают и откатываются.
- Служба MSDTC остановлена или заблокирована корпоративным фаерволом.
1. Настройка параметров безопасности MSDTC в Component Services
На обоих серверах (локальном и удаленном):
- Откройте
dcomcnfg(Службы компонентов). - Перейдите:
Службы компонентов -> Компьютеры -> Мой компьютер -> Distributed Transaction Coordinator -> Локальный DTC. - Откройте свойства и во вкладке Безопасность (Security) включите:
- Сетевой доступ к DTC (Network DTC Access);
- Разрешить входящие (Allow Inbound) и Разрешить исходящие (Allow Outbound);
- Аутентификация не требуется (No Authentication Required) (при междоменных транзакциях) либо Mutual Authentication (внутри одного домена);
- Включить XA-транзакции (Enable XA Transactions).
2. Перезапуск службы MSDTC
# Выполнить в PowerShell от администратора
Restart-Service -Name MSDTC -Force
Get-Service -Name MSDTC3. Настройка портов Windows Firewall для RPC и MSDTC
# Разрешение динамических портов RPC и трафика MSDTC
New-NetFirewallRule -DisplayName "MSDTC-In-TCP" -Direction Inbound -Protocol TCP -LocalPort 135 -Action Allow
New-NetFirewallRule -DisplayName "MSDTC-Out-TCP" -Direction Outbound -Protocol TCP -LocalPort 135 -Action Allow
New-NetFirewallRule -DisplayName "MSDTC-Service" -Program "%SystemRoot%\system32\msdtc.exe" -Action Allow4. Отключение распределенных транзакций для сессии или сервера
Если распределенные двухфазные транзакции не требуются, отключите их продвижение через T-SQL:
-- Отключение автоматического промоушена распределенных транзакций на Linked Server
EXEC sp_serveroption @server = 'LINKED_SERVER_NAME', @optname = 'remote proc transaction promotion', @optvalue = 'false';
-- Использование явного XACT_ABORT
SET XACT_ABORT ON; Частые вопросы (FAQ)
Почему простой SELECT вызывает ошибку распределенной транзакции 7391?
Если на сервере включен параметр sp_serveroption 'remote proc transaction promotion' = 'true', любой вызов хранимой процедуры или модификации данных через связанный сервер внутри открытой локальной транзакции (BEGIN TRAN) автоматически пытается перевести транзакцию в статус распределенной под управлением MSDTC.
Как проверить сетевую доступность DTC между серверами?
Используйте официальную утилиту Microsoft DTCPing. Запустите ее одновременно на двух серверах и протестируйте двусторонний RPC-обмен на порту 135 и в динамическом диапазоне портов (49152-65535).
Что делать, если серверы находятся в разных рабочих группах или недоверенных доменах?
В свойствах безопасности MSDTC на обоих хостах необходимо выбрать режим 'No Authentication Required' и убедиться, что NetBIOS-имена серверов резолвятся в IP-адреса через DNS или hosts.
Как исправить ошибку 7391 без настройки MSDTC?
Установите для связанного сервера параметр remote proc transaction promotion в значение false и оберните внешние вызовы в конструкцию OPENQUERY, которая выполняется вне контекста двухфазного коммита.