操作对LINQ to SQL ExecuteCommand的事务状态无效

时间:2014-01-09 11:56:00

标签: c# multithreading wcf transactionscope

所以我有以下代码:

var transactionScopeOptions = new TransactionOptions() { IsolationLevel = IsolationLevel.ReadUncommitted, Timeout = TimeSpan.FromMinutes(2) };
            using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Required, transactionScopeOptions))
            {

/* Linq update, insert, delete, read, etc. */


protected const string UpdateQuery = @"SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
                             BEGIN TRANSACTION;

                             /* dirty reads & 3 table updates */

                             COMMIT TRANSACTION;"

   dataContext.ExecuteCommand(UpdateQuery, new object[] { fooID, fooTime })
   transactionScope.Complete();
            }

首先,我不做Linq到Sql字符串查询,然后在一个类中,我使用了很长的字符串查询来更新3个表。这是我得到例外的部分。 (在ExecuteCommand中)

环境是WCF多线程,项目开始时有一个日志,项目结束时有另一个日志,这不是超时异常。

我处理了超过数十万个并发设置为多个的项目。

知道抛出异常的原因吗? dataContext仅对每个项目实例化一次。

编辑:命令超时设置为1小时,错误发生在启动后的几分钟内。如果队列中的项目少于100,000个,通常不会发生这种情况。

编辑: stacktrace:

  

在   System.Transactions.TransactionState.EnlistPromotableSinglePhase(InternalTransaction   tx,IPromotableSinglePhaseNotification   promotableSinglePhaseNotification,Transaction atomicTransaction)
  在   System.Transactions.Transaction.EnlistPromotableSinglePhase(IPromotableSinglePhaseNotification   promotableSinglePhaseNotification)at   System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(交易   tx)at   System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(交易   交易)   System.Data.ProviderBase.DbConnectionPool.TryGetConnection(的DbConnection   owningObject,UInt32 waitForMultipleObjectsTimeout,Boolean   allowCreate,Boolean onlyOneCheckConnection,DbConnectionOptions   userOptions,DbConnectionInternal&连接)   System.Data.ProviderBase.DbConnectionPool.TryGetConnection(的DbConnection   owningObject,TaskCompletionSource 1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource 1重试,DbConnectionOptions   userOptions,DbConnectionInternal&连接)   System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(的DbConnection   outerConnection,DbConnectionFactory connectionFactory,   TaskCompletionSource 1 retry, DbConnectionOptions userOptions) at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource 1   重试)在System.Data.SqlClient.SqlConnection.Open()处   System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser   用户)在System.Data.Linq.SqlClient.SqlProvider.get_IsSqlCe()at   System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode()at   System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(表达式   查询)在System.Data.Linq.DataContext.ExecuteCommand(String   命令,对象[]参数)

1 个答案:

答案 0 :(得分:0)

您可以尝试在连接字符串中关闭连接池,我注意到在SQL操作通过IIS登记的分布式事务已提交或回滚之前,连接似乎已返回到池中。虽然这样做的症状是ussaly连接超时,但它可能值得一试。

ADD“pooling = false;”到您的连接字符串