2014-01-09 93 views
2

所以我有以下代碼:操作是無效的交易的LINQ to SQL ExecuteCommand的狀態

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 to SQL字符串查詢,然後在一類,我用了很長的字符串查詢來更新3個表格。這是我得到例外的部分。 (在ExecuteCommand中)

環境是WCF多線程,在項目啓動時有一個日誌,當項目結束時有一個日誌,它不是超時異常。

我處理超過數十萬個併發設置爲多項的項目。

任何想法爲什麼拋出異常? dataContext僅爲每個項目實例化一次。

編輯:命令超時設置爲1小時,錯誤發生在幾分鐘內從開始。如果隊列中的項目少於100,000個,通常不會發生這種情況。

編輯:堆棧跟蹤:

在 System.Transactions.TransactionState.EnlistPromotableSinglePhase(InternalTransaction TX,IPromotableSinglePhaseNotification promotableSinglePhaseNotification,事務AtomicTransaction的)
在 System.Transactions.Transaction.EnlistPromotableSinglePhase(IPromotableSinglePhaseNotification promotableSinglePhaseNotification)at System.Data.SqlClient.SqlInternalConnec tion.EnlistNonNull(事務 TX)在 System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(事務 交易)在 System.Data.ProviderBase.DbConnectionPool.TryGetConnection(的DbConnection owningObject,UInt32的waitForMultipleObjectsTimeout,布爾 allowCreate,布爾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 重試)在System.Data.SqlClient.SqlConnection.Open()在 System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection (IConnectionUser 用戶)在System.Data.Linq.SqlClient.SqlProvider.get_IsSqlCe()在 System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode()在 System.Data.Linq.SqlClient.SqlProvider.System.Data。 Linq.Provider.IProvider.Execute(Expression query)at System.Data.Linq.DataContext。ExecuteCommand(字符串 命令,對象[]參數)

+0

你可以添加堆棧跟蹤嗎? – Maarten

+0

那裏,剛剛添加了stacktrace .. – MilkTea027

回答

0

您可以嘗試在連接字符串中關閉連接池,我已經注意到,連接似乎分佈式事務的SQL操作入伍之前返回到池通過IIS提交或回滾。儘管這種症狀在連接超時方面並不理想,但可能值得一試。

ADD「pooling = false;」到你的連接字符串

相關問題