2016-05-03 2 views
1

Я унаследовал код, который выполняет 5 различных хранимых процедур, которые обновляются в фоновом режиме, и каждый из них имеет свой собственный объект транзакции. я завернут вся 5 SQL транзакции внутри объекта области видимости транзакции, поскольку все они должны совершить или откат в то же время, и теперь он бросает следующее сообщение об ошибке:TransactionScope с вложенными транзакциями sql

An exception of type 'System.Transactions.TransactionManagerCommunicationException' 
occurred in applicationname.dll but was not handled in user code 

Additional information: Network access for Distributed Transaction Manager (MSDTC) has been disabled. 
Please enable DTC for network access in the security configuration for 
MSDTC using the Component Services Administrative tool. 

Это функция, где, как только хиты коды , он бросает исключение:

Protected Overridable Function GetParameters(ByRef inConnection As SqlClient.SqlConnection _ 
            , ByVal inStoredProcedureName As String _ 
            , ByVal inIncludeReturnValue As Boolean) As SqlClient.SqlParameter() 

    Return SqlHelperParameterCache.GetSpParameterSet(inConnection, inStoredProcedureName, inIncludeReturnValue) 
End Function 

Эта статья объясняет, как решить эту проблему: The transaction manager has disabled its support for remote/network transactions

, но я не хочу, чтобы эти параметры без понимания этого вопроса. не могу ли я обернуть sqltransactions внутри транзакции или эта проблема происходит, потому что они используют свои соединения?

--update 1

Наша DBA теперь включена MSDTC и она работает на все вызовы, за исключением, когда я звоню в WCF веб-сервис. Он просто бросает мне исключение таймаута Сейчас:

The operation has timed out 
    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

    Exception Details: System.Net.WebException: The operation has timed out 

Source Error: 


    An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. 

Трассировка стека:

[WebException: The operation has timed out] 
System.Net.HttpWebRequest.GetResponse() +8420880 
System.ServiceModel.Channels.HttpChannelRequest.WaitForReply(TimeSpan timeout) +234 

[TimeoutException: The HTTP request to 'http://test/testValidationService/test.svc' has exceeded the allotted timeout of 00:01:00. The time allotted to this operation may have been a portion of a longer timeout.] 

System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason) +7074108 
    System.ServiceModel.Channels.HttpChannelRequest.WaitForReply(TimeSpan timeout) +16650152 
    System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout) +388 


[TimeoutException: The request channel timed out while waiting for a reply after 00:00:59.9843749. Increase the timeout value passed to the call to Request or increase the SendTimeout value on the Binding. The time allotted to this operation may have been a portion of a longer timeout.] 
System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) +14579646 
System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) +622 

Update 2

Тайм-аут, казалось, вызвано замком. Таким образом, у меня есть транзакция внутри транзакции, и я подумал, что транзакция будет проигнорирована сейчас, поскольку транзакция - это оболочка, но, видимо, мне все же приходится совершать или откатывать эту отдельную транзакцию, которая, похоже, устранила проблему. от того, что я читал, что индивидуальный фиксация/откат будет проигнорирован, поскольку последнее слово будет обработано транзакцией? это правильно? может ли кто-нибудь пролить свет на него?

+0

Тайм-аут может быть совершенно прав. Возможно, что вы делаете на своем сервисе, требуется более 1 минуты, поскольку, похоже, он настроен при просмотре ошибки? –

+0

@Simon: Я просто обнаружил, что это происходит из-за тупика. Прежде чем читать статьи, если у меня есть транзакция как родительская, обертывающая все вызовы, и любой дочерний метод, использующий собственную индивидуальную транзакцию, будет проигнорирован, однако, похоже, это не так? – Baahubali

+1

Трудно помочь в диагностике тупика с DTC, потому что он в значительной степени зависит от вашего контекста, конфигурации, безопасности и т. Д., Пытайтесь выполнить Google в тупике DTC и т. Д. Также убедитесь, что вы создаете экземпляр TransactionScope с параметром IsolationLevel.ReadCommitted (для соответствия стандарту SQL-сервера: http://stackoverflow.com/questions/11292763/why-is-system-transactions-transactionscope-default-isolationlevel-serializable) –

ответ

3

Какую версию SQL Server вы используете?

В SQL Server 2005 и более ранние версии:

  1. DTC эскалация будет иметь место, как только вы открываете несколько подключений к БД.

  2. Чтобы предотвратить эскалацию, используйте один и тот же объект SqlConnection во всех запросах внутри транзакции.

В SQL Server 2008 и выше:

  1. Открытие и закрытие соединения, так что только одна связь открыта в то время не будет нагнетать.
  2. Вложенные sqlconnections немедленно перейдут на DTC.

Присылайте этот вопрос для получения более подробной информации об этом. TransactionScope automatically escalating to MSDTC on some machines?

+0

Я использую SQL Server 2008 R2. – Baahubali

+0

наш dba отказывается включить указанные опции. существует ли риск для безопасности? – Baahubali

+0

В этом убедиться, что только одно соединение Sql открыто одновременно, тогда вам не нужно включать MSTDC. Ваш dba прав, поскольку это не относится к распределенной транзакции, которую вы должны использовать для предотвращения эскалации DTC. –

Смежные вопросы