Se si verifica una perdita di connettività mentre si utilizza MSDTC per gestire una transazione distribuita in più server, la transazione distribuita viene lasciata in uno stato sconosciuto o "in dubbio". Tali interruzioni sono generalmente dovute alle cause seguenti:
errori di rete
arresto di MSSQLSERVER o MSDTC
arresto di altri servizi correlati
in uno o più computer coinvolti nella transazione distribuita. MSDTC lascia in uno stato incoerente tutte le transazioni in corso al momento dell'interruzione della connessione. Le transazioni "in dubbio" causano questi sintomi in quanto SQL Server non è in grado di determinare se eseguire il commit o il rollback delle transazioni e necessita quindi di MSDTC per procedere.
Per ulteriori informazioni sugli errori 3437, 3414 e "Impossibile connettersi a DTC" all'avvio di SQL Server, vedere l'articolo della Microsoft Knowledge Base 306366.
Esistono diversi metodi per risolvere le transazioni distribuite lasciate in uno stato incoerente.
È possibile utilizzare il metodo descritto nell'argomento sulla risoluzione dei problemi relativi alle transazioni MSDTC della documentazione online di SQL Server.
Se si arresta MSDTC in uno o più server coinvolti in una o più transazioni distribuite, il problema potrebbe essere risolto semplicemente riavviando MSDTC.
È spesso possibile utilizzare la console di amministrazione di MSDTC.
Per utilizzare la console di amministrazione di MSDTC:
. Digitare "mmc.exe" (senza le virgolette) nella finestra di dialogo Esegui per aprire Microsoft Management Console (MMC).
. In MMC scegliere Aggiungi/Rimuovi snap-in dal menu della console.
. Nella finestra di dialogo Aggiungi/Rimuovi snap-in fare clic su Aggiungi.
. Nella finestra di dialogo Aggiungi snap-in autonomo fare clic su Servizi componenti, quindi su Aggiungi per aggiungere lo snap-in.
. Fare clic su Chiudi
. Nella finestra di dialogo Aggiungi/Rimuovi snap-in fare clic su OK.
. Nella radice console in Servizi componenti espandere Servizi componenti, selezionare Computer, Risorse del computer e infine scegliere Distributed Transaction Coordinator.
. Selezionare Elenco transazioni. Le transazioni verranno visualizzate nel riquadro dei dettagli. Fare clic con il pulsante destro del mouse sulla transazione, quindi scegliere Risolvi. Sono disponibili tre opzioni, ovvero Commit, Abbandona o Ignora. Scegliere l'opzione appropriata.
Target | Microsoft.SQLServer.2008.DBEngine | ||
Category | EventCollection | ||
Enabled | True | ||
Event_ID | 3437 | ||
Event Source | $Target/Property[Type="SQL!Microsoft.SQLServer.DBEngine"]/ServiceName$ | ||
Alert Generate | True | ||
Alert Severity | Warning | ||
Alert Priority | Normal | ||
Remotable | True | ||
Alert Message |
| ||
Event Log | Application | ||
Comment | Mom2008ID='{6B1C776D-E075-4F73-B9C0-66CEF9024905}';MOM2008GroupID={467ECC75-C5DA-42BD-955C-A73BBB51AF74} |
ID | Module Type | TypeId | RunAs |
---|---|---|---|
_F6DA1507_12AF_11D3_AB21_00A0C98620CE_ | DataSource | Microsoft.Windows.EventProvider | Microsoft.SQLServer.SQLDefaultAccount |
GenerateAlert | WriteAction | System.Health.GenerateAlert | Default |
<Rule ID="Microsoft.SQLServer.2008.Error_recovering_database_._Could_not_connect_to_MSDTC_to_check_the_completion_status_of_transaction_1_5_Rule" Target="SQL2008Core!Microsoft.SQLServer.2008.DBEngine" Enabled="true" ConfirmDelivery="true" Remotable="true" Comment="Mom2008ID='{6B1C776D-E075-4F73-B9C0-66CEF9024905}';MOM2008GroupID={467ECC75-C5DA-42BD-955C-A73BBB51AF74}">
<Category>EventCollection</Category>
<DataSources>
<DataSource ID="_F6DA1507_12AF_11D3_AB21_00A0C98620CE_" Comment="{F6DA1507-12AF-11D3-AB21-00A0C98620CE}" TypeID="Windows!Microsoft.Windows.EventProvider" RunAs="SQL!Microsoft.SQLServer.SQLDefaultAccount">
<ComputerName>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</ComputerName>
<LogName>Application</LogName>
<Expression>
<And>
<Expression>
<SimpleExpression>
<ValueExpression>
<XPathQuery>PublisherName</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value>$Target/Property[Type="SQL!Microsoft.SQLServer.DBEngine"]/ServiceName$</Value>
</ValueExpression>
</SimpleExpression>
</Expression>
<Expression>
<SimpleExpression>
<ValueExpression>
<XPathQuery>EventDisplayNumber</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value>3437</Value>
</ValueExpression>
</SimpleExpression>
</Expression>
</And>
</Expression>
</DataSource>
</DataSources>
<WriteActions>
<WriteAction ID="GenerateAlert" TypeID="SystemHealth!System.Health.GenerateAlert">
<Priority>1</Priority>
<Severity>1</Severity>
<AlertMessageId>$MPElement[Name="Microsoft.SQLServer.2008.Error_recovering_database_._Could_not_connect_to_MSDTC_to_check_the_completion_status_of_transaction_1_5_Rule.AlertMessage"]$</AlertMessageId>
<AlertParameters>
<AlertParameter1>$Data/EventDescription$</AlertParameter1>
</AlertParameters>
<Suppression>
<SuppressionValue/>
</Suppression>
</WriteAction>
</WriteActions>
</Rule>