2012-03-23 17 views
6

Tôi đang sử dụng Universal Providers mới từ Microsoft cho phiên trong SQL Server. Việc triển khai phiên cũ trên SQL Server yêu cầu một công việc (chạy từng phút) để xóa các phiên hết hạn. Cái mới làm điều này kiểm tra và rõ ràng về mọi yêu cầu. Vì tôi đang thực sự chạy trong SQL Azure, tôi không có đại lý SQL để sắp xếp công việc, vì vậy điều này nghe có vẻ giống như một cách hợp lý để đi về nó (không, tôi không muốn trả tiền cho Azure Cache cho phiên).OptimisticConcurrencyException với System.Web.Providers

Vấn đề là khi nhiều người dùng truy cập trang web cùng một lúc, cả hai đều cố gắng xóa các phiên đã hết hạn cùng một lúc và lần thứ hai nhận được ngoại lệ đồng thời lạc quan.

System.Data.OptimisticConcurrencyException: Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries. 
    at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter) 
    at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options) 
    at System.Web.Providers.DefaultSessionStateProvider.PurgeExpiredSessions() 
    at System.Web.Providers.DefaultSessionStateProvider.PurgeIfNeeded() 
    at System.Web.SessionState.SessionStateModule.BeginAcquireState(Object source, EventArgs e, AsyncCallback cb, Object extraData) 
    at System.Web.HttpApplication.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
    at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

Tôi đang sử dụng ELMAH để ghi lỗi và điều này hiển thị với một số tần suất. Trước khi tôi cố gắng cấu hình ELMAH để bỏ qua các lỗi, có ai biết cách ngăn chặn các lỗi xảy ra ngay từ đầu không? Có một số cấu hình với các nhà cung cấp mới mà tôi đang thiếu không?

+0

Tôi cũng gặp phải sự cố tương tự. Bạn đã tìm ra cách khắc phục vấn đề này chưa? Cách duy nhất tôi có thể nghĩ là dịch ngược mã? Mọi gợi ý – chugh97

+2

Điều tốt nhất tôi có thể nói, Microsoft không thực sự hỗ trợ các nhà cung cấp này. Người hoài nghi trong tôi nói rằng họ đang cố gắng để thúc đẩy người dùng Azure trả tiền cho bộ nhớ cache. Tôi muốn một người nào đó chứng minh tôi sai. Cuối cùng, chúng tôi đã từ bỏ nó và quay trở lại một nhà cung cấp SQL Server thẳng. Chúng tôi đã cần một máy chủ khác để lập kế hoạch cho các công việc không liên quan khác, vì vậy chúng tôi cũng đã xóa công việc đã hết hạn trong đó. Xin lỗi tôi không có gì tốt hơn để báo cáo. – icrf

+0

Bạn đã giải quyết vấn đề này chưa? Tôi đang chạy vào cùng một vấn đề bản thân mình. – onit

Trả lời

1

Gói này có nội dung tôi mô tả là lỗi. Tiền đề của trạng thái phiên quá trình là nhiều trường hợp có thể đang quản lý trạng thái phiên làm sạch. Trong trường hợp này, tất cả các trường hợp đang chạy phương thức này ...

private void PurgeExpiredSessions() 
{ 
    using (SessionEntities entities = ModelHelper.CreateSessionEntities(this.ConnectionString)) 
    { 
     foreach (SessionEntity entity in QueryHelper.GetExpiredSessions(entities)) 
     { 
      entities.DeleteObject(entity); 
     } 
     entities.SaveChanges(); 
     this.LastSessionPurgeTicks = DateTime.UtcNow.Ticks; 
    } 
} 

Vấn đề là một trường hợp xóa các thực thể trước (các) đối tượng khác và lỗi nêu trong bài đăng. Tôi hỏi các tác giả gói để phát hành mã nguồn hoặc sửa lỗi này .. văn bản chưa được kiểm tra sửa chữa biên tập viên của tôi sẽ có thêm công ảo, vì vậy người ta có thể ghi đè phương pháp này hoặc chỉ cần thay đổi nó quá ..

private void PurgeExpiredSessions() 
{ 
    using (SessionEntities entities = ModelHelper.CreateSessionEntities(this.ConnectionString)) 
    { 
     var sqlCommand = @"DELETE dbo.Sessions WHERE Expires < GETUTCDATE()"; 
     entities.ExecuteStoreCommand(sqlCommand); 
     this.LastSessionPurgeTicks = DateTime.UtcNow.Ticks; 
    } 
} 

Các tác giả gói thực sự nhanh chóng với phản hồi (trả lời khi đăng bài này!) và hôm nay họ đã tuyên bố rằng họ đang làm việc để phát hành mã nhưng họ có thể sửa lỗi này. Tôi đã yêu cầu một ETA và sẽ cố gắng theo dõi ở đây nếu tôi nhận được.

Gói lớn, nó chỉ cần bảo dưỡng một chút.

Câu trả lời đúng: Chờ bản phát hành mã nguồn hoặc bản cập nhật sửa lỗi. Hoặc De-biên dịch và sửa chữa nó cho mình (Nếu đó là phù hợp với giấy phép!)

* Cập nhật các chủ sở hữu gói đang xem xét sửa chữa nó trong tuần này. Yeah! * * Update.SOLVED !!! Họ rõ ràng đã sửa chữa nó một thời gian trước và tôi đã cài đặt gói sai .. Tôi đã sử dụng http://nuget.org/packages/System.Web.Providers và tôi nên đã sử dụng http://nuget.org/packages/Microsoft.AspNet.Providers/ .. Nó không rõ ràng với tôi mà một trong những di sản và bao gồm trong gói khác. Họ quấn nó trong một cái bẫy rỗng ..

private void PurgeExpiredSessions() 
{ 
    try 
    { 
     using (SessionEntities entities = ModelHelper.CreateSessionEntities(this.ConnectionString)) 
     { 
      foreach (SessionEntity entity in QueryHelper.GetExpiredSessions(entities)) 
      { 
       entities.DeleteObject(entity); 
      } 
      entities.SaveChanges(); 
      this.LastSessionPurgeTicks = DateTime.UtcNow.Ticks; 
     } 
    } 
    catch 
    { 
    } 
} 

Cảm ơn nhóm giải pháp cho những phản hồi nhanh và hỗ trợ tuyệt vời này !!!

+0

** Cập nhật. Chúng tôi đã thử điều này trong Azure với khoảng 250 người dùng đồng thời và SQL Azure đã cung cấp cho chúng tôi thông báo lỗi cho biết máy vật lý không thể chấp nhận bất kỳ kết nối nào nữa mặc dù chúng tôi nằm trong giới hạn kết nối cho phép của chúng tôi. Phán quyết của tôi là tránh loại quản lý phiên này trong Azure. BTW lý do duy nhất chúng tôi đã cố gắng này là bởi vì người ủng hộ phiên hiện tại của chúng tôi, Azure Caching, đã có quá nhiều mất điện. – TheDev6

2

Vui lòng tải xuống phiên bản mới hơn của các nhà cung cấp có thể tìm thấy tại đây: http://www.nuget.org/packages/System.Web.Providers. Chúng tôi đã cập nhật cách chúng tôi xóa các phiên hết hạn để chạy không đồng bộ và xử lý các điều kiện lỗi. Vui lòng cho chúng tôi biết nếu điều đó không khắc phục được sự cố của bạn.

+0

Cảm ơn bạn đã cập nhật. Tôi sẽ cố gắng xem xét nó vào cuối tuần này hoặc đầu sau khi tôi hoàn thành dự án hiện tại của mình. Có bất kỳ loại nhật ký thay đổi công khai nào không? Trong khi tôi chuyển Session ra khỏi các nhà cung cấp mặc định, tôi vẫn đang sử dụng Membership/Role. – icrf

+0

Tôi đánh dấu đây là giải pháp, nhưng tôi chưa thử nghiệm để xem liệu nó có thực sự khắc phục được sự cố hay không. Chúng tôi đã chuyển sang Xem trước bộ nhớ đệm Azure cho phiên, vì vậy việc kiểm tra điều này không khả thi đối với tôi nữa. – icrf

+0

Tôi có cùng vấn đề chính xác khi sử dụng Sql Azure và nuget mới nhất tháng 6 năm 2012. Trong trường hợp của tôi, tôi đang thoát khỏi đồng vị xanh nằm trong bộ nhớ đệm vì nó đã gây ra nhiều sự cố do lỗi lưu trữ (trình quản lý trạng thái cache) và các phiên bản mới không cập nhật các cá thể phụ thuộc của địa chỉ IP mới (azure có nhiều điểm lỗi không xác định). Scott, gói Universal Provider này thật tuyệt! Bất kỳ theo dõi trên các lỗi mặc dù? Có vẻ như một trong hai trường hợp trong azure đánh bại người khác với PurgeExpiredSessions(). – TheDev6

1

Tôi đã đăng câu hỏi về vấn đề này tại NuGet (http://www.nuget.org/packages/System.Web.Providers) và nhận được phản hồi rất nhanh từ chủ sở hữu. Sau một chút về phía sau và phía trước, hóa ra họ có một sửa chữa cho điều này, nhưng sẽ được ra trong bản cập nhật tiếp theo.

Có một gợi ý ở đây, rằng Microsoft không quá quan tâm đến việc hỗ trợ điều này, nhưng kinh nghiệm của tôi đã được nếu không, và luôn nhận được sự hỗ trợ tốt.

+0

Bằng cách "đăng câu hỏi", bạn có muốn "liên hệ với chủ sở hữu của gói" hay không hoặc có phương pháp nào khác để đăng câu hỏi trên NuGet không? Rất nhiều dự án khác của Microsoft đang sử dụng Codeplex hoặc Google Code hoặc Github và tất cả chúng đều có trình theo dõi vấn đề và hệ thống thảo luận. Tôi không thể tìm thấy dự án này ở bất kỳ đâu để thảo luận mở. – icrf