Вопрос по iis-6, linq-to-sql, sql-server-2008, linq – Периодическое InvalidCastException и «Серверу не удалось возобновить транзакцию» с Linq

10

Я вижу это на нашей сценической системе, после того, как она просуществовала 2-3 дня ».

Серверу не удалось возобновить транзакцию. Описание изделия: 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.GetEnumerator()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at ...

После того, как это произошло, весь сервер пошел на хер. Похоже, что метаданные больше не правильно отображаются в памяти, потому что я вижу много InvalidCastExceptions впоследствии. Я'Я предполагаю, что это связано с тем, что система пытается десериализовать строку в поле 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

ОБНОВЛЕНИЕ: Структура кода делает что-то вроде этого:

var dc = new datacontext()
IList 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();
    }
}
Какой сервер перезагружается? SQL Server или веб-сервер? Rap
Мы сталкиваемся с этой проблемой, не в состоянии точно определить какую-либо конкретную хранимую процедуру, после этого все вызовы начинают сбой. Sanjeevakumar Hiremath
Веб-сервер; или на самом деле просто приложение. Soraz
У нас та же проблема - приложение время от времени вылетает и остается сбойным до перезагрузки. Те же исключенияСерверу не удалось возобновить транзакцию и InvalidCastExceptions выбрасываются. Интересно, что другой экземпляр того же приложения работает без сбоев. Помимо использования двух (возможно, создающих помехи) текстовых данных, они могут иметь какое-то отношение к методу создания экземпляров текстовых данных в контейнере IoC. Я не могПока проблема не решена, поэтому любая информация о вашем прогрессе будет принята с благодарностью! PanJanek
@PanJanek - я добавил пост, описывающий причину. По сути, мы передавали неразрешенные элементы IQuery объекту ReportViewer, который работал в другом домене. Это оставляло висячие ссылки, поэтому текст данных никогда не располагался должным образом. Soraz

Ваш Ответ

4   ответа
1

Просто обновление:

Я отследил ошибку, связанную с нашим использованием Linq2Sql-сущностей, передаваемых в качестве источников данных непосредственно на сервер отчетов.

То есть мы делали что-то вроде этого:

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

По какой-то причине это приводило в замешательство текстовый текст, даже при работе в одном домене приложения.

4

Вероятно, это не проблема с вашим кодом. Это ошибка в SQL Server. У них была похожая проблема в SQL Server 2005. Это происходило только в условиях, которые были просто правильными, поэтому очень немногие когда-либо видели это, и те, кто это делал, были очень смущены.

Сказав это, вот несколько вещей, которые нужно проверить, которые сработали для других с такой же проблемой:

Ищите DataReaders, которые нет закрыто. Убедись, что ты'выполняется myReader.Close () после прочтения нужных вам строк. Многие просто качаются, не закрываясь.По возможности используйте собственный класс SqlTransaction вместо OleDbTransactions.Посмотрите на ваши транзакции. Убедись, что ты'перед совершением соединения / откатом перед закрытием соединения.Используйте Connection.BeginTransation вместо Connection.BeginDbTransaction
@Rap Есть ли у вас источник этой ошибки? Возможно, Microsoft Connect URL? Статья кб? John Zabroski
@ Рэп, откуда ты знаешь, что это ошибка, неужели ты сообщаешь об этом? sepehr
Какие'с отрицательными голосами? Как насчет некоторых комментариев? @Soraz не сделалне могу ничего сказать о Linq-to-SQL до тех пор, пока не ответит Rap
Источник - только мой опыт и общение с другими. Ничего из Microsoft, на которое я могу указать. Надеюсь, что это имеет значение. Кажется, он помогает тем, кто наткнулся на этот ответ. Rap
Спасибо за ваш ответ. У нас есть 0 Datareaders, sql транзакций или другой материал, написанный вручную. Все делается с помощью datacontext, автоматически сгенерированного из файла dbml, и каждый доступ осуществляется через linq. Так что у меня нет beginTransactions или connection.closes, потому что я никогда не обращаюсь с ними напрямую. Все это в (Microsoft) рамки Soraz
1
Дон»не могут использовать один и тот же DataContext для разных операций. Используйте тот же DataContext, чтобы сгруппировать набор операций, которые вы будете отправлять. Если у вас есть другой набор, который вы будете отправлять отдельно, используйте отдельный DataContext.Я не уверен, но также проверьте, перечисляете ли вы более 2 IQueryables одновременно. Если это'В этом случае попробуйте использовать отдельный DataContext для второго перечисления, чтобы убедиться, что это не так.t вызвано тем, что linq2sql пытается открыть читателям одновременно.Убедитесь, что ваша модель соответствует вашей БД. Структура определена в конструкторе Linq2sql isn 'обновляется автоматически, поэтому при добавлении поля необходимо убедиться, чтодобавлен в конструктор (возможно, добавив таблицу заново, если у вас нетпереименовал любые поля).
Модель обновлена как минимум в коде, потому что сайт отлично работает за 2 дня до того, как что-то случится. Я'Мы добавили OT с примером того, что делает код в точке сбоя. Soraz
0

поможет много с проблемами соединения, если существует.

также иногда вам нужно проверить, например, на физическое повреждение оперативной памяти.

Похожие вопросы