2011-06-07 94 views
3
Stack Trace: at System.Transactions.TransactionState.EnlistPromotableSinglePhase(InternalTransaction tx, IPromotableSinglePhaseNotification promotableSinglePhaseNotification, Transaction atomicTransaction) 
    at System.Transactions.Transaction.EnlistPromotableSinglePhase(IPromotableSinglePhaseNotification promotableSinglePhaseNotification) 
    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() 
    at System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user) 
    at 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(Expression query) 
    at System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression) 
    at System.Linq.Queryable.All[TSource](IQueryable`1 source, Expression`1 predicate) 

此時我沒有使用交易或TransactionScope。事務是否由框架自動創建(如果框架不存在),還是事務從某個地方溜進來?獲取「該操作對交易狀態無效」,但我沒有使用交易

這是C#.NET 4,使用LINQ-to-SQL查詢MS SQL 2008。

回答

2

的LINQ to SQL創建當你這樣做的SaveChanges,以便提交是原子事務 - 即要麼全部更改保存或無。

1

雖然不是一個替代答案,我想在這個擴大正如我剛纔經歷過這個問題,我自己的應用程序。

我有一個使用.NET 4.0框架ASP.Net應用程序,我看到了同樣的調用堆棧和異常,從SqlConnection.Open至少()起。這個異常需要一段時間才能發生,一個小時的20多個用戶訪問應用程序通常足以觸發它。但是,異常的根本原因可能與OP的不同。

我發現的是,異常正在被拋出,因爲工作線程處理ASP.Net請求包含一個環境事務,該環境事務引用事先已中止並由Finalizer線程清理的事務。本質上,創建事務的代碼不會處理它,因此它是由Finalizer來清理資源。問題是,直到Finalzer完成它的事情後,工作線程的環境事務纔會被清除。這意味着將在Finalizer完成之前在線程上執行的未來請求將引入此已中止的事務(必須啓用自動登錄,除非您特別登記)。

的根本原因這個問題是一個噩夢追捕,所以希望如果有人打他們不會花一個星期超過了他們在良好的老WinDbg的眼球同樣的問題,就像我剛纔做:)