Диспетчер транзакций отключил поддержку удаленных и сетевых транзакций
Я использую SQL Server и ASP.NET. у меня есть следующая функция:
Using js = daoFactory.CreateJoinScope()
Using tran = New Transactions.TransactionScope()
'...
tran.Complete()
End Using
End Using
однако, исключение'диспетчер транзакций отключил поддержку удаленных и сетевых транзакций.' бросается.
описание JoinScope:
Public Class JoinScope
Implements IJoinScope
Implements IDisposable
'...
End Class
Я работал таким образом в другом приложении с той же средой без проблем, но здесь у меня есть эта проблема. Что я могу сделать, чтобы исправить проблему?
7 ответов:
убедитесь, что Служба " координатор распределенных транзакций работает на базе и клиенте. Также убедитесь, что вы проверяете "доступ к сети DTC", " разрешить удаленный клиент", "Разрешить входящий / исходящий"и" включить подсказку".
чтобы включить доступ к сети DTC для транзакций MS DTC
откройте оснастку "службы компонентов".
чтобы открыть службы компонентов, нажмите кнопку Пуск. В поле поиска введите MMC, а затем нажмите ВХОДИТЬ.
разверните дерево консоли, чтобы найти DTC (например, локальный DTC), для которого требуется включить сетевой доступ MS DTC.
меню Действие выберите пункт Свойства.
нажмите на вкладку "Безопасность" и внесите следующие изменения: В разделе Параметры безопасности установите флажок доступ к сети DTC.
в разделе связь диспетчера транзакций выберите Разрешить входящий и разрешить исходящий чек ящики.
Я получал эту проблему периодически, я следовал инструкциям здесь и очень похожие в другом месте. Все было настроено правильно.
эта страница:http://sysadminwebsite.wordpress.com/2012/05/29/9/ помог мне найти проблему.
в основном у меня были дубликаты CID для MSDTC на обоих серверах. 【\CID
см.:http://msdn.microsoft.com/en-us/library/aa561924.aspx раздел убедитесь, что MSDTC присвоено уникальное значение CID
Я работаю с виртуальными серверами, и наша команда серверов любит использовать один и тот же образ для каждого сервера. Это простое исправление, и нам не нужен перезапуск. Но служба DTC действительно нуждалась в настройке для автоматического запуска и должна была быть запущена после переустановки.
комментарий от другого ответ: "убедитесь, что вы используете одно и то же открытое соединение для всех вызовов базы данных внутри транзакции. - Магнус "(не знаю, как связать комментарии)
наши пользователи хранятся в отдельной БД от данных, с которыми я работал в транзакциях. Открытие подключения к БД, чтобы получить пользователя было причиной этой ошибки для меня. Перемещение другого подключения к БД и поиска пользователя за пределы области транзакции исправило ошибку.
в моем сценарии исключение было вызвано тем, что я пытался создать новый экземпляр соединения в TransactionScope на уже существующем соединении:
пример:
void someFunction() { using (var db = new DBContext(GetConnectionString())) { using (var transaction = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted })) { someOtherFunction(); // This function opens a new connection within this transaction, causing the exception. } } } void someOtherFunction() { using (var db = new DBContext(GetConnectionString())) { db.Whatever // <- Exception. } }
У меня была процедура хранения, которая вызывает другую процедуру хранения в "связанном сервере".когда я выполняю его в ssms, это было нормально,но когда я вызываю его в приложении(по Entity Framework), я получил эту ошибку. Эта статья помогла мне и я использовал этот скрипт:
EXEC sp_serveroption @server = 'LinkedServer IP or Name',@optname = 'remote proc transaction promotion', @optvalue = 'false' ;
для более подробной информации посмотрите на это: связанный сервер : Партнерский диспетчер транзакций отключил поддержку удаленных и сетевых транзакций
я публикую ниже решение здесь, потому что после некоторого поиска это то, где я приземлился, так что другие тоже могут. Я пытался использовать EF 6 для вызова хранимой процедуры, но имел аналогичную ошибку, потому что хранимая процедура имела связанного сервера используется.
не удалось выполнить операцию, так как поставщик OLE DB _ for linked server _ не смог начать распределенную транзакцию
менеджер транзакций партнера имеет отключил поддержку удаленных и сетевых транзакций*
перескакивая через SQL Client исправил мою проблему, которая также подтвердила для меня, что это была вещь EF.
модель EF генерируется попытка на основе метода:
db.SomeStoredProcedure();
попытка на основе ExecuteSqlCommand:
db.Database.ExecuteSqlCommand("exec [SomeDB].[dbo].[SomeStoredProcedure]");
С:
var connectionString = db.Database.Connection.ConnectionString; var connection = new System.Data.SqlClient.SqlConnection(connectionString); var cmd = connection.CreateCommand(); cmd.CommandText = "exec [SomeDB].[dbo].[SomeStoredProcedure]"; connection.Open(); var result = cmd.ExecuteNonQuery();
этот код можно сократить, но я думаю, что версия немного удобнее для отладки и пошагового выполнения через.
Я не считаю, что клиент Sql обязательно является предпочтительным выбором, но я чувствовал, что это, по крайней мере, стоит поделиться, если кто-то еще, имеющий подобные проблемы, попадает сюда google.
приведенный выше код является C#, но концепция пытается переключиться на Sql Client по-прежнему применяется. По крайней мере, это будет диагностическая попытка сделать это.
в случае, если другие имеют те же проблемы:
У меня была аналогичная ошибка происходит. оказалось, что я упаковывал несколько операторов SQL в транзакции, где один из них выполнялся на связанном сервере (оператор Merge в EXEC(...) В операторе сервера). Я решил проблему, открыв отдельное соединение со связанным сервером, инкапсулировав этот оператор в попытке...затем catch прерывает транзакцию на исходном соединении в случае отключения catch.