Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 定期无效的例外情况和;服务器无法恢复事务";与林克_Linq_Linq To Sql_Sql Server 2008_Iis 6 - Fatal编程技术网

Linq 定期无效的例外情况和;服务器无法恢复事务";与林克

Linq 定期无效的例外情况和;服务器无法恢复事务";与林克,linq,linq-to-sql,sql-server-2008,iis-6,Linq,Linq To Sql,Sql Server 2008,Iis 6,我在我们的舞台系统上看到了这个,在它运行了2-3天后 “服务器无法恢复事务。Desc:39000000ef。”(Desc:xxx每次都在增加) 堆栈跟踪显示 System.Data.SqlClient.SqlException: The server failed to resume the transaction. Desc:39000000ef. at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Bo

我在我们的舞台系统上看到了这个,在它运行了2-3天后

“服务器无法恢复事务。Desc:39000000ef。”(Desc:xxx每次都在增加)

堆栈跟踪显示

System.Data.SqlClient.SqlException: The server failed to resume the transaction. Desc:39000000ef.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.ExecuteReader()
at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult)
at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries)
at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
at System.Data.Linq.DataQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at ...
这是什么意思

我相当肯定数据库没有在系统后面更新,而且数据库一直在线

这个问题从现在开始一直存在,直到服务器重新启动,之后一切都正常工作

如果数据库连接失败,我需要重新建立数据库连接的代码吗?框架不是自己处理这个问题吗

我正在使用Sql server 2008、IIS 6和.Net 3.5SP1

更新: 代码结构的作用如下:

var dc = new datacontext()
IList<someobject> objs = dc.GetAllItemsToProcess()
var dc2 = new datacontext();
 foreach( var o in objs ) {
    try {
         var o2 = dc2.someobjects.SingleOrDefault(x=>x.id = o.id);
          // do stuff to o2
         dc2.save();
   } catch() {
          // something failed so restart datacontext()
         dc2 = new datacontext();
    }
}
List<Order> orderList = orderRepository.getOrders();
ReportViewer rv = new ReportViewer();
rv.LocalReport.DataSources.Add("OrderList", orderList);
rv.Render();
var dc=new datacontext()
IList objs=dc.getAllItemStopProcess()
var dc2=新数据上下文();
foreach(objs中的var o){
试一试{
var o2=dc2.someobjects.SingleOrDefault(x=>x.id=o.id);
//对氧气做些什么
dc2.save();
}捕获(){
//某些操作失败,因此重新启动datacontext()
dc2=新的datacontext();
}
}

您的代码可能没有问题。这是SQL Server中的一个bug。他们在SQLServer2005中遇到了类似的问题。它只发生在恰到好处的条件下,所以很少有人见过它,而那些见过它的人非常困惑

话虽如此,以下是一些对其他有同样问题的人有效的检查方法:

  • 寻找不属于您的数据读取器 关闭确定你在做什么 myReader.Close()在您阅读 你想要的行。很多人只是摇滚 不停地打开
  • 使用本机SqlTransaction类 而不是在任何地方进行OLEDB传输 可能
  • 看看你的交易记录。确保 您正在提交/回滚 在您关闭连接之前,请保持干净
  • 使用Connection.beginstation而不是 而不是Connection.BeginDbTransaction

您是否将DataContext对象用于原子工作单元?这将有助于解决连接问题(如果存在)

例如,有时您还需要检查RAM中是否存在物理损坏。

  • 不要在不同的操作之间共享相同的DataContext。使用相同的DataContext对要提交的操作集进行分组。如果您有另一个要单独提交的集合,请使用单独的DataContext
  • 我不确定,但还要检查您是否同时枚举了2个以上的iQueryTables。如果是这种情况,请尝试为第二个枚举使用单独的DataContext,以确保它不是由linq2sql试图同时向读者打开引起的
  • 确保您的模型与数据库是最新的。Linq2sql设计器中定义的结构不会自动更新,因此在添加字段时,需要确保该字段已添加到设计器中(如果没有重命名任何字段,可能需要重新添加表)
只是一个更新:

  • 我跟踪了这个bug,发现我们使用了作为数据源直接传递到报表服务器的Linq2Sql实体
也就是说,我们在做这样的事情:

var dc = new datacontext()
IList<someobject> objs = dc.GetAllItemsToProcess()
var dc2 = new datacontext();
 foreach( var o in objs ) {
    try {
         var o2 = dc2.someobjects.SingleOrDefault(x=>x.id = o.id);
          // do stuff to o2
         dc2.save();
   } catch() {
          // something failed so restart datacontext()
         dc2 = new datacontext();
    }
}
List<Order> orderList = orderRepository.getOrders();
ReportViewer rv = new ReportViewer();
rv.LocalReport.DataSources.Add("OrderList", orderList);
rv.Render();
List orderList=orderRepository.getOrders();
ReportViewer rv=新的ReportViewer();
rv.LocalReport.DataSources.Add(“OrderList”,OrderList);
rv.Render();

出于某种原因,这使得datacontext变得混乱,即使在同一应用程序域中运行。

哪个服务器重新启动?SQL Server或web服务器?web服务器;或者实际上只是应用程序。我们也有同样的问题——应用程序不时崩溃,直到重新启动。引发相同的异常“服务器无法恢复事务”和InvalidCastExceptions。有趣的是,同一应用程序的另一个实例运行平稳。除了使用两个(可能是相互错误的)datacontext之外,它还可能与IoC容器中的datacontext实例化方法有关。到目前为止,我还没有找到问题的答案,所以如果您有任何进展,我们将不胜感激@PanJanek-我在下面添加了一篇文章,概述了原因。基本上,我们将未解析的IQuery元素传递给ReportViewer对象,该对象在另一个域中运行。这导致引用悬空,因此datacontext从未正确处理。我们面临此问题,无法精确定位到任何特定的存储过程,在此之后,所有调用开始失败。感谢您的回复。我们有0个数据读取器、sql事务或其他手工编码的东西。一切都是通过从dbml文件自动生成的datacontext完成的,每次访问都是通过linq完成的。因此,我没有beginTransactions或connection.closes,因为我从不直接处理它们。这一切都在(微软)的框架内。否决票是怎么回事?有什么评论吗@在我回答之前,Soraz没有说任何关于Linq to SQL的内容。@Rap你有这个bug的来源吗?微软连接网址,也许?KB文章?@Rap,你怎么知道这是一个bug,你报告了吗?来源只是我的经验和与他人的交谈。微软没有我能指出的东西。希望这很重要。这似乎有助于其他偶然发现这个答案的人。该模型至少在代码中得到了更新,因为该网站在出现问题之前可以完美运行2天。我在OT后面附加了代码在失败点所做的示例。