是否可以在不允许升级到DTC的情况下将.NET的TransactionScope与Sql Server 2005一起使用?

时间:2009-12-08 21:14:07

标签: c# .net sql-server sql-server-2005 transactions

我正在处理屁股服务器中的一些真正的痛苦,我希望他们只使用没有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()

5 个答案:

答案 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连接字符串参数