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。
答案 0 :(得分:2)
当您执行SaveChanges时,LINQ to SQL会创建一个事务,以便提交是原子的 - 即所有更改都是save或none。
答案 1 :(得分:1)
虽然不是替代答案我想扩展这个,因为我刚刚使用自己的应用程序遇到过这个问题。
我有一个使用.Net 4.0框架的ASP.Net应用程序,我看到相同的callstack和异常,至少从SqlConnection.Open()开始。异常需要一段时间才能发生,访问应用程序的20多个用户通常足以触发它。但是,异常的根本原因可能与OP有所不同。
我发现异常是抛出异常,因为处理ASP.Net请求的工作线程包含一个环境事务,该事务引用先前已中止并被Finalizer线程清除的事务。基本上,创建事务的代码没有处理它,因此它归结为Finalizer来清理资源。问题是,在Finalzer完成其工作之前,工作线程的环境事务不会被清除。这意味着在Finalizer完成之前在线程上执行的未来请求将在此已经中止的事务中登记(除非您特意登记,否则必须启用自动登记)。
这个问题的根本原因是如果有人遇到同样的问题就会陷入噩梦,他们不会像我刚刚做的那样在一个好的旧WinDbg上用他们的眼球花一周时间。)