2008-10-10 39 views
7

Chúng tôi đang cố gắng xây dựng một hệ thống ghi số lượng đơn hàng cao. Có ba bảng chính: 1. Đơn đặt hàng 2. OrderDetails 3. OrderShipmentLINQ to SQL và các vấn đề tương tranh

Bảng lô hàng chứa kỷ lục n mỗi đơn hàng và bất kỳ lưu trữ hồ sơ lô hàng có thể thay đổi trước khi khách hàng chấp nhận trật tự thứ, sau đó nó là đông lạnh. (Yêu cầu kinh doanh)

Mặc dù điều này có thể không xảy ra trong các tình huống thực tế ... trong khi kiểm tra tải, chúng tôi đang nhận ngoại lệ System.Data.Linq.ChangeConflictException. Kết thúc quá trình gửi trong bộ chuyển đổi cũng không giúp ích gì. Chúng ta không thể buộc LINQ để có được một khóa trên hàng cho toàn bộ thời gian hoạt động cập nhật?

Có cách nào khác để vượt qua điều này không?

+0

How are you xử lý LINQ đồng thời? – flesh

Trả lời

7

Nếu bạn gặp sự cố chính hãng với cập nhật đồng thời trên cùng một dữ liệu, thì bạn có thể xem xét thực hiện toàn bộ hoạt động trong giao dịch - tức là nhận dữ liệu cam kết. Miễn là bạn xử lý get/update/commit như một hoạt động nguyên tử ngắn ngủi (tức là bạn không tạm dừng cho người dùng nhập vào ở giữa) thì nó sẽ là OK.

Cụ thể, với mức cách ly có thể tuần tự hóa, không ai có thể cập nhật dữ liệu mà bạn có khóa đọc (nghĩa là mọi thứ bạn đã truy vấn). Vấn đề duy nhất là điều này có thể dẫn đến các tình huống bế tắc nếu các truy vấn khác nhau đang đọc dữ liệu theo các thứ tự khác nhau. AFAIK, không có cách nào để có được LINQ-to-SQL để đưa ra gợi ý (UPDLOCK), đó là một sự xấu hổ.

Hoặc là một TransactionScope hoặc một SqlTransaction sẽ làm, miễn là chúng được đặt làm phân lập tuần tự (là mặc định cho TransactionScope).

+0

Xin chào, Cảm ơn bạn đã trả lời ... Tôi đã thử gói nó theo một giao dịch, tôi chỉ nhận được một ngoại lệ khác ... rằng hoạt động là nạn nhân của bế tắc. Trân trọng, Ashish Sharma –

+0

Tôi tự hỏi liệu đó có phải là bế tắc khóa leo thang hay một bế tắc trật tự khác không?Nếu tùy chọn cũ, một (mặc dù bạn mất nhiều lợi ích LINQ) có thể truy vấn dữ liệu bằng SP - thì bạn có thể đưa gợi ý UPDLOCK vào, ngăn chặn các vấn đề về leo thang khóa. –

+0

(vẫn thông qua LINQ, ý tôi là - nói với nhà thiết kế rằng SP này trả về bảng này) –

1

bạn có thể muốn xem xét Entity Framework thực hiện mọi thứ dưới dạng giao dịch. Dưới đây là hai podcast mà cũng có thể thú vị về Entity Framework.

DNRTV - part 1 - part 2

+1

LINQ-to-SQL cũng sử dụng các giao dịch; vấn đề ở đây là giao dịch tương tự không kéo dài quá trình nhận và thiết lập - nhưng điều đó giống với LINQ-to-SQL hoặc EF. –

1

Đối với loại tình huống này, tức là nơi có hơn một người sử dụng có thể muốn thay đổi cùng một kỷ lục/khách hàng/đặt hàng/bất cứ điều gì nó là tốt hơn để xây dựng "khóa" vào logic ứng dụng thay vì sử dụng khóa cơ sở dữ liệu.

Sử dụng khóa DB để giải quyết khóa dữ liệu hợp lý sẽ hiển thị cho bạn một loạt vấn đề mới. Một giải pháp tốt hơn là có các cột và/hoặc bảng nơi bạn có thể chỉ ra rằng một đơn đặt hàng/khách hàng/vv đang được chỉnh sửa [bởi một người dùng], cho đến khi nó bị khóa vv Truy vấn bảng (hoặc cột) để kiểm tra xem khách hàng/thứ tự/vật có sẵn để chỉnh sửa trước khi cho phép người dùng khác chỉnh sửa nó.

Xem: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=3984968&SiteID=1

+0

Bạn có thể sửa chữa liên kết bị hỏng không? – douglaslps

+0

Tôi ước tôi có thể. Thật không may, Microsoft đã cập nhật các diễn đàn MSDN, và trong quá trình họ đã giết tất cả các liên kết đến bài viết/chủ đề, bao gồm cả một ở trên. Chủ đề vẫn còn tồn tại ở đâu đó, nhưng tôi không nhớ nó là cái gì ... – KristoferA