2009-07-23 38 views
5

Với LINQ to SQL:LINQ to SQL: Concurrency độ phân giải

using (var db = Database.Context) 
{ 
    var root = (from post in db.Post 
       where post.Id == rootPostId 
       select post).Single(); 

    root.LastActivityUtc = DateTime.UtcNow; 

    db.SubmitChanges(); 
} 

Điều gì sẽ xảy ra nếu cùng một kỷ lục được đồng thời bị thay đổi bởi một cuộc gọi đến cùng một phương pháp (trong đó mã này sống) với rootPostId cùng ? Một ngoại lệ có bị ném không?

Trong sự kiện như vậy - xung đột đồng thời - Tôi muốn xử lý nó bằng cách đơn giản loại bỏ thay đổi sao cho chỉ một bản cập nhật cho LastActivityUtc được gửi thay vì cả hai, có thể sẽ có cùng giá trị.

Trả lời

6

Bạn có thể phát hiện và giải quyết vấn đề đồng thời của bạn, bằng cách bắt một ChangeConflictException:

using (var db = new MyDataContext()) 
{ 
    var root = (from post in db.Post 
       where post.Id == rootPostId 
       select post).Single(); 

    root.LastActivityUtc = DateTime.UtcNow; 

    try 
    { 
     db.SubmitChanges(); 
    } 
    catch (ChangeConflictException) 
    { 
     db.ChangeConflicts.ResolveAll(RefreshMode.KeepChanges); 
     db.SubmitChanges(); 
    } 
} 

Với RefreshMode .KeepChanges bạn sẽ giữ tất cả những thay đổi của các đối tượng khách hàng của bạn, và những thay đổi từ những người dùng khác trên các lĩnh vực khác sẽ đã hợp nhất.

bài được khuyến nghị:

0

Điều này có vẻ giống như một ứng cử viên tốt cho một thủ tục được lưu trữ. Thay vì cập nhật chọn /, tạo một thủ tục lưu trữ đơn giản, được thực hiện như sau:

CẬP NHẬT bài SET LastActivityUtc = GETUTCDATE() WHERE Id = @ id

Vượt qua id để các thủ tục lưu trữ và gọi nó là bất cứ khi nào bạn muốn để cập nhật hoạt động cuối cùng của bài đăng.

+0

Toàn bộ vấn đề của việc sử dụng LINQ to SQL, ít nhất là đối với tôi, là để tránh việc để tạo ra một thủ tục lưu trữ . Tôi không sử dụng phiên bản Kiến trúc sư của VS, vì vậy tôi không muốn mở SQL Management Studio. Tiếp tục, gọi tôi là lười biếng. :) – core

+2

Ok, bạn lười biếng. Tôi không phải là một fan hâm mộ lớn của các thủ tục được lưu trữ, hoặc, nhưng họ có vị trí của họ, và loại thay đổi nhanh chóng là chính xác những gì họ đang tốt cho. Sử dụng đúng công cụ cho công việc. LINQ to SQL là một cái búa rất lớn. Không phải mọi thứ đều là đinh. – Randolpho