Widzę to na naszym systemie stage, po 2-3 dniach.Periodic InvalidCastException i "Serwer nie mógł wznowić transakcji" z Linq
"Serwer nie mógł wznowić transakcji Desc: 39000000ef." (z opisem: przyrost xxx za każdym razem).
Ślad stosu pokazuje
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 ...
Po to się stało cały serwer idzie do diabła. Wygląda na to, że metadane nie są już prawidłowo reprezentowane w pamięci, ponieważ później widzę wiele InvalidCastExceptions. Zgaduję, że jest to spowodowane tym, że system próbuje deserializować ciąg znaków do pola int, ponieważ metadane są niepoprawnie kompensowane.
tj
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)
Co to oznacza?
Jestem prawie pewien, że baza danych nie została zaktualizowana za systemami, a baza danych była przez cały czas online.
Problem występuje od tego momentu, aż serwer zostanie ponownie uruchomiony, po czym wszystko działa poprawnie.
Czy muszę mieć kod, który przywraca połączenie z bazą danych, jeśli się nie powiedzie? Czy framework sam sobie z tym nie poradzi?
Używam serwera SQL 2008, IIS 6 i .Net 3.5SP1
UPDATE: Struktura kod robi coś takiego:
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();
}
}
Który serwer zostanie zrestartowany? Serwer SQL lub serwer WWW? – Rap
Serwer internetowy; lub właściwie tylko aplikacja. – Soraz
Mamy ten sam problem - aplikacja ulega awarii od czasu do czasu i pozostaje zawieszona aż do ponownego uruchomienia. Te same wyjątki "Serwer nie mógł wznowić transakcji" i zgłoszono InvalidCastExceptions. Interesujące jest to, że inna instancja tej samej aplikacji działa sprawnie. Oprócz użycia dwóch (potencjalnie interferujących) danych tekstowych, może to mieć coś wspólnego z metodą tworzenia datacutext w kontenerze IoC. Nie udało mi się jak dotąd znaleźć rozwiązania problemu, więc każda aktualizacja Twojego postępu zostanie doceniona! – PanJanek