我正在处理屁股服务器中的一些真正的痛苦,我希望他们只使用没有DTC的交易(现在我可以集中精力在其他地方)。我在范围内使用多个数据库,因此典型的行为是推广,但我想避免它。如果可能的话,在这种模式下,不确定交易的行为是什么?我假设tx.Complete()会抛出?
之所以这样,是因为我得到了这些随机错误(如果你能提供帮助的话,可以自由地说明为什么这样做 - 这些是SPORADIC,而不是常数):
System.Transactions.TransactionManagerCommunicationException: Communication with the underlying transaction manager has failed. ---> System.Runtime.InteropServices.COMException (0x80004005): Error HRESULT E_FAIL has been returned from a call to a COM component.
at System.Transactions.Oletx.IDtcProxyShimFactory.ReceiveTransaction(UInt32 propgationTokenSize, Byte[] propgationToken, IntPtr managedIdentifier, Guid& transactionIdentifier, OletxTransactionIsolationLevel& isolationLevel, ITransactionShim& transactionShim)
at System.Transactions.TransactionInterop.GetOletxTransactionFromTransmitterPropigationToken(Byte[] propagationToken)
--- End of inner exception stack trace ---
at System.Transactions.TransactionInterop.GetOletxTransactionFromTransmitterPropigationToken(Byte[] propagationToken)
at System.Transactions.TransactionStatePSPEOperation.PSPEPromote(InternalTransaction tx)
at System.Transactions.TransactionStateDelegatedBase.EnterState(InternalTransaction tx)
at System.Transactions.EnlistableStates.Promote(InternalTransaction tx)
at System.Transactions.Transaction.Promote()
at System.Transactions.TransactionInterop.ConvertToOletxTransaction(Transaction transaction)
at System.Transactions.TransactionInterop.GetExportCookie(Transaction transaction, Byte[] whereabouts)
at System.Data.SqlClient.SqlInternalConnection.GetTransactionCookie(Transaction transaction, Byte[] whereAbouts)
at System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx)
at System.Data.SqlClient.SqlInternalConnection.Enlist(Transaction tx)
at System.Data.SqlClient.SqlInternalConnectionTds.Activate(Transaction transaction)
at System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction)
at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
答案 0 :(得分:4)
不幸的是,我不认为在涉及多个数据库时,甚至是使用多个连接对象的单个数据库时,可以避免将事务提升为DTC事务。
答案 1 :(得分:1)
同一TransactionScope 下的两个单独的连接必须注册到DTC。你可以:
你不能“忽略”这个方面并将其留待以后使用,事务一致性是所有数据库操作的基础,而不是事后发布之前的一些事情。在编写第一行代码之前,你必须先 。
答案 2 :(得分:1)
在执行事务(以及使用事务管理器)时,唯一可以避免DTC的方法是,如果只使用一个SQL Server 2008和.Net 3.0实例。
答案 3 :(得分:0)
我感觉到你的痛苦,但是使用完全相同的技术堆栈已经超过4年了,我还没有找到避免DTC的方法。
虽然您的应用程序可能实际上不会提升您的查询以使用MSDTC(假设您使用单个数据库和单个连接字符串),但“事务”命名空间仍然会旋转并检查以确保MSDTC存在且可用。
至于我已经能够确定(并且我已经花费了大量的时间)......如果它无法与MSDTC交谈(即使它最终也不会使用它),那么它将会抛出一个例外。每次。期。
[编辑:]如果您正在使用多个数据库,那么当您需要多个资源时,事务系统会将协调委托给MSDTC,因此您处于更糟糕的位置。
答案 4 :(得分:0)
查看MultipleActiveResultSets连接字符串参数