收到“操作对事务的状态无效”的错误提示,但我并没有使用事务。

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个回答

2
LINQ to SQL 在执行 SaveChanges 操作时创建一个事务,确保提交是原子性的,即所有更改要么全部保存,要么不保存。

1
虽然这不是我想要的备选答案,但我想扩展一下,因为我刚刚遇到了自己应用程序的这个问题。 我有一个使用.Net 4.0框架的ASP.Net应用程序,至少从SqlConnection.Open()开始,我看到了相同的调用堆栈和异常。 异常需要一段时间才能发生,通常是20多个用户访问应用程序的一个小时就足以触发它。 然而,异常的根本原因可能与OP的不同。
我发现异常被抛出是因为处理ASP.Net请求的工作线程包含引用先前中止并正在被Finalizer线程清理的事务的环境事务。 基本上,创建事务的代码没有处理它,因此必须由Finalizer来清理资源。 问题在于,工作线程的环境事务直到Finalzer完成其工作才会被清除。 这意味着在Finalizer完成之前在该线程上执行的未来请求将加入此已中止的事务(必须启用自动注册,除非您明确注册)。
此问题的根本原因很难追踪,因此希望如果有人遇到相同的问题,他们不会像我刚刚做的那样花费一周以上的时间深入WinDbg :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接