2009-09-07 42 views
10

我在舞臺系統上看到了這一點,它已經運行了2-3天。與Linq的定期InvalidCastException和「服務器無法恢復交易」

「服務器無法恢復交易,說明: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 ... 

在這之後發生的整個服務器去見鬼。似乎元數據在內存中不再正確表示,因爲之後會看到許多InvalidCastException。我猜這是由於系統試圖將字符串反序列化爲int字段,因爲元數據偏移不正確。

System.InvalidCastException: Specified cast is not valid. 
at System.Data.SqlClient.SqlBuffer.get_Int32() 
at System.Data.SqlClient.SqlDataReader.GetInt32(Int32 i) 
at Read_Order(ObjectMaterializer`1) 
at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext() 
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 

這是什麼意思?

我非常確定數據庫沒有在系統後面更新,數據庫一直在線。

從這裏開始,問題依然存在,直到服務器重新啓動,之後一切正常。

我是否需要擁有能夠在數據庫連接失敗時重新建立數據庫連接的代碼?框架本身不處理?

我使用SQL Server 2008,IIS 6,和.Net 3.5SP1

UPDATE: 的代碼結構做這樣的事情:

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(); 
    } 
} 
+0

哪個服務器重新啓動得到? SQL Server或Web服務器? – Rap 2009-09-16 14:04:39

+0

網絡服務器;或者實際上只是應用程序。 – Soraz 2009-09-17 20:22:59

+1

我們遇到同樣的問題 - 應用程序不時崩潰,直到重新啓動後纔會崩潰。同樣的例外「服務器無法恢復事務」並拋出InvalidCastExceptions。有趣的是,同一個應用程序的另一個實例運行平穩。除了使用兩個(可能干擾的)datacontext之外,它可能與IoC容器中的datacontext實例化方法有關。到目前爲止我找不到問題解決方案,所以如果您有任何更新,我們將不勝感激! – PanJanek 2010-05-11 14:19:03

回答

1

只是一個更新:

  • 我找到的bug我們使用的數據源直接到報表服務器通過LINQ2SQL實體的。

即在相同的應用程序域運行時

List<Order> orderList = orderRepository.getOrders(); 
ReportViewer rv = new ReportViewer(); 
rv.LocalReport.DataSources.Add("OrderList", orderList); 
rv.Render(); 

出於某種原因,這使迷茫的datacontext,連:我們正在做這樣的事情。

4

這可能不是一個有問題的你碼。這是SQL Server中的一個錯誤。他們在SQL Server 2005中遇到了類似的問題。它只發生在正確的條件下,所以很少有人看到它,而那些確實很混亂。

話雖如此,這裏有一些事情要檢查有同樣的問題,努力爲別人:

  • 查找的DataReader未 關閉。在閱讀所需的 行之後,請確保您正在執行 myReader.Close()。很多人只是搖搖欲墜 沒有關閉。
  • 使用本機SqlTransaction類 代替OleDbTransactions,只要 可能。
  • 看看你的交易。請確保 在您關閉連接之前乾淨地提交/回滾 。
  • 使用Connection.BeginTransation而 不是Connection.BeginDbTransaction
+0

謝謝你的回覆。 我們有0的DataReader,SQL交易或其他手工編寫的東西。一切都是通過從dbml文件自動生成的datacontext完成的,每個訪問都是通過linq完成的。 所以我沒有beginTransactions,或connection.closes,因爲我從來沒有直接處理它們。它的全部在(微軟)框架 – Soraz 2009-09-17 20:24:47

+3

什麼是downvotes?如何評論?在我回答之前,@Soraz沒有對Linq-to-SQL做任何說明。 – Rap 2009-09-18 02:14:23

+1

@Rap你有這個bug的來源嗎?微軟連接URL,也許?知識庫文章? – 2013-10-11 19:23:02

0

你使用工作的原子單位DataContext對象?如果存在,這將有助於解決連接問題。

有時您還需要檢查RAM中的物理損壞情況。

1
  • 不共享不同的操作中相同的DataContext。使用相同的DataContext將您要提交的一組操作分組。如果你有另外一組你將要分開提交使用一個單獨的DataContext。
  • 我不知道,還要檢查一下,如果你在同一時間枚舉超過2個IQueryables。如果是這樣,請嘗試爲第二個枚舉使用單獨的DataContext,以確保它不是由linq2sql試圖同時打開給讀取器造成的。
  • 確保你的模型是最新的,與你的數據庫。 Linq2sql設計器中定義的結構不會自動更新,因此當添加一個字段時,需要確保將其添加到設計器中(如果未重命名任何字段,可能需要重新添加表)。
+0

該模型至少在代碼中進行了更新,因爲該網站在事情發生之前完全運行了2天。 我已經附加了OT以實例的代碼執行在故障點什麼。 – Soraz 2009-09-22 06:59:46