2009-09-07 26 views
10

Tôi thấy điều này trên hệ thống sân khấu của chúng tôi, sau khi nó đã được lên đến 2-3 ngày.Định kỳ không hợp lệCastException và "Máy chủ không thể tiếp tục giao dịch" với LINQ

"Máy chủ không thể tiếp tục giao dịch. MÔ TẢ: 39000000ef". (với desc: xxx tăng mỗi lần).

Các vết đống lãm

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 ... 

Sau đó đã xảy ra toàn bộ máy chủ đi vào quái. Dường như siêu dữ liệu không còn được biểu diễn chính xác trong bộ nhớ nữa, bởi vì tôi thấy nhiều InvalidCastExceptions sau đó. Tôi đoán điều này là do hệ thống cố gắng deserialize một chuỗi vào một trường int vì siêu dữ liệu được bù đắp không chính xác.

ví dụ:

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) 

này có ý nghĩa gì?

Tôi khá chắc chắn cơ sở dữ liệu không được cập nhật phía sau hệ thống và cơ sở dữ liệu đã trực tuyến toàn bộ thời gian.

Sự cố vẫn tiếp diễn từ đây trở đi, cho đến khi máy chủ khởi động lại, sau đó mọi thứ hoạt động tốt.

Tôi có cần phải có mã để thiết lập lại kết nối cơ sở dữ liệu nếu không thành công không? Khung không tự xử lý nó?

Tôi đang sử dụng SQL Server 2008, IIS 6, và Net 3.5SP1

UPDATE: Cấu trúc mã không một cái gì đó như thế này:

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

Máy chủ nào được khởi động lại? Máy chủ SQL hoặc máy chủ web? – Rap

+0

Máy chủ web; hoặc thực sự chỉ là ứng dụng. – Soraz

+1

Chúng tôi có cùng một vấn đề - ứng dụng bị treo theo thời gian và vẫn bị lỗi cho đến khi được khởi động lại. Các ngoại lệ tương tự "Máy chủ không thể tiếp tục giao dịch" và InvalidCastExceptions được ném. Điều thú vị là một ví dụ khác của cùng một ứng dụng chạy trơn tru. Ngoài việc sử dụng hai (có thể can thiệp) datacontext nó có thể có một cái gì đó để làm với phương pháp instant instant datacontext trong container IoC. Tôi không thể tìm thấy sự cố về sự cố cho đến nay, vì vậy mọi cập nhật về tiến trình của bạn sẽ được đánh giá cao! – PanJanek

Trả lời

1

Chỉ cần một bản cập nhật:

  • tôi theo dõi các lỗi để chúng tôi sử dụng Linq2Sql-đơn vị truyền như datasources trực tiếp đến Báo cáo Server.

I.e. chúng tôi đã làm một cái gì đó như thế này:

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

Vì một số lý do khiến bối cảnh dữ liệu bị nhầm lẫn, ngay cả khi chạy trong cùng một miền ứng dụng.

4

Điều này có thể không phải là một vấn đề với bạn mã. Nó là một lỗi trong SQL Server. Họ đã có một vấn đề tương tự trong SQL Server 2005. Nó chỉ xảy ra trong điều kiện vừa đúng, vì vậy rất ít người từng thấy nó và những người đã làm rất bối rối.

Có nói rằng, đây là một số điều cần kiểm tra xem đã làm việc cho người khác với cùng một vấn đề:

  • Hãy tìm DataReaders mà không đóng cửa. Đảm bảo bạn đang thực hiện myReader.Close() sau khi bạn đọc hàng bạn muốn. Nhiều người chỉ cần đá mà không đóng.
  • Sử dụng lớp SqlTransaction gốc thay vì OleDbTransactions ở bất kỳ nơi nào có thể.
  • Xem giao dịch của bạn. Đảm bảo bạn đang cam kết/lùi lại trước khi đóng Kết nối.
  • Sử dụng Connection.BeginTransation thay hơn Connection.BeginDbTransaction
+0

Cảm ơn bạn đã trả lời. Chúng tôi có 0 Datareaders, giao dịch sql hoặc các công cụ chuyển mã khác. Tất cả mọi thứ được thực hiện thông qua các datacontext autogenerated từ các tập tin dbml, và mọi truy cập là thông qua LINQ. Vì vậy, tôi không có beginTransactions, hoặc connection.closes, bởi vì tôi không bao giờ xử lý chúng trực tiếp. Tất cả trong khung công tác (microsoft) – Soraz

+3

Điều gì với các downvotes? Làm thế nào về một số ý kiến? @ Soraz không nói gì về Linq-to-SQL cho đến sau câu trả lời của tôi. – Rap

+1

@Rap Bạn có nguồn cho lỗi này không? Microsoft Connect URL, có lẽ? Bài viết KB? –

0

Bạn có sử dụng DataContext đối tượng cho các đơn vị nguyên tử của công việc? điều này sẽ giúp rất nhiều với các vấn đề kết nối nếu tồn tại.

đôi khi bạn cần kiểm tra xem có hỏng hóc vật lý trong RAM không.

1
  • Không chia sẻ cùng một DataContext giữa các hoạt động khác nhau. Sử dụng cùng một DataContext để nhóm tập hợp các hoạt động mà bạn sẽ gửi. Nếu bạn có một bộ khác mà bạn sẽ được gửi riêng sử dụng một DataContext riêng biệt.
  • Tôi không chắc chắn, nhưng cũng kiểm tra xem bạn có đang liệt kê hơn 2 IQueryables cùng một lúc hay không. Nếu đó là trường hợp, hãy thử sử dụng một DataContext riêng biệt cho điều tra thứ hai để đảm bảo rằng nó không phải là do linq2sql cố gắng để mở cho độc giả cùng một lúc.
  • Đảm bảo mô hình của bạn được cập nhật với DB của bạn. Cấu trúc xác định trong trình thiết kế Linq2sql không được cập nhật tự động, vì vậy khi bạn thêm một trường bạn cần đảm bảo rằng được thêm vào trình thiết kế (có thể bằng cách thêm lại bảng nếu bạn chưa đổi tên bất kỳ trường nào).
+0

Mô hình được cập nhật trong mã ít nhất, vì trang web chạy hoàn hảo trong 2 ngày trước khi xảy ra sự cố. Tôi đã nối thêm OT với ví dụ về mã nào ở điểm không thành công. – Soraz

Các vấn đề liên quan