2009-09-07 9 views
10

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

Który serwer zostanie zrestartowany? Serwer SQL lub serwer WWW? – Rap

+0

Serwer internetowy; lub właściwie tylko aplikacja. – Soraz

+1

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

Odpowiedz

1

właśnie aktualizacja:

  • I śledzone bakcyla do naszego użycia linq2sql-podmiotach przekazywane jako źródła danych bezpośrednio do serwera raportów.

tj. robiliśmy coś takiego:

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

Z jakiegoś powodu ten dokonał datacontext mylić, nawet podczas pracy w tej samej domenie aplikacji.

4

Jest to prawdopodobnie nie jest to problem z telefonem kod. To błąd w SQL Server. Miały podobny problem w SQL Server 2005. Stało się tak tylko w dobrych warunkach, więc niewielu ludzi to widziało, a ci, którzy to zrobili, byli bardzo zdezorientowani.

powiedziawszy, oto kilka rzeczy do sprawdzenia, które pracowały dla innych z tym samym problemem:

  • Look dla DataReaders że nie są zamknięte. Upewnij się, że robiszmyReader.Close() po przeczytaniu żądanych wierszy . Wiele osób po prostu gra na gitarze bez zamykania.
  • Użyj natywnej klasy SqlTransaction zamiast OleDbTransactions, gdzie tylko możliwe jest .
  • Sprawdź swoje transakcje. Upewnij się, że jesteś zobowiązany/czyściutko przed zamknięciem połączenia.
  • Zastosowanie Connection.BeginTransation raczej niż Connection.BeginDbTransaction
+0

Dziękuję za odpowiedź. Mamy 0 Datareaderów, transakcji sql lub innych handcoded stuff. Wszystko odbywa się za pośrednictwem pliku danych wygenerowanego automatycznie z pliku dbml, a każdy dostęp odbywa się przez linq. Tak więc nie mam beginTransactions lub connection.close, ponieważ nigdy nie obsługuję ich bezpośrednio. Wszystko w ramach (microsoft) – Soraz

+3

Co słychać w dół? A może kilka komentarzy? @Soraz nie mówił nic o Linq-SQL, dopóki nie otrzymam odpowiedzi. – Rap

+1

@Rap Czy masz źródło tego błędu? Może Microsoft Link URL? Artykuł KB? –

0

Używasz DataContext obiektu dla jednostek atomowych pracy? pomoże to w rozwiązaniu problemów z połączeniem, jeśli takie istnieją.

również czasami trzeba sprawdzić fizyczne uszkodzenia w pamięci RAM, na przykład.

1
  • Nie udostępniaj tego samego DataContext między różnymi operacjami. Użyj tego samego DataContext, aby pogrupować zestaw operacji, które będziesz przesyłać. Jeśli masz inny zestaw, który będziesz przesyłać oddzielnie, użyj osobnego Kontekstu danych.
  • Nie jestem pewien, ale również sprawdź, czy wyliczasz na 2 IQueryables w tym samym czasie. W takim przypadku spróbuj użyć oddzielnego DataContext dla drugiego wyliczenia, aby upewnić się, że nie jest spowodowane linq2sql próbowaniem otwarcia dla czytelników w tym samym czasie.
  • Upewnij się, że twój model jest aktualny w Twoim DB. Struktura zdefiniowana w projekcie Linq2sql nie jest aktualizowana automatycznie, więc po dodaniu pola należy upewnić się, że jest ono dodane do projektanta (być może poprzez ponowne dodanie tabeli, jeśli nie zmieniono nazwy żadnego pola).
+0

Model jest aktualizowany przynajmniej w kodzie, ponieważ witryna działa idealnie przez 2 dni, zanim coś się stanie. Dołączyłem OT z przykładem tego, co robi kod w punkcie awarii. – Soraz

Powiązane problemy