2011-06-07 92 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的眼球同样的问题,就像我刚才做:)