2008-10-10 12 views
7

Staramy się zbudować system rekordów zamówień o dużej objętości. Istnieją trzy podstawowe tabel: 1. Zamówienia 2. ORDERDETAILS 3. OrderShipmentLINQ do problemów SQL i współbieżności

tabela przesyłka zawiera n rekord za zamówienie i każdy wpis rekord przesyłka może zostać zmieniony, zanim Klient akceptuje tego rzędu, po którym to mrożony. (Wymaganie biznesowe)

Chociaż może się to nie zdarzyć w rzeczywistych scenariuszach ... podczas naszych testów obciążeniowych, otrzymujemy wyjątki System.Data.Linq.ChangeConflictException. Zawijanie zgłoszeń w transacionie również nie pomaga. Czy nie możemy zmusić LINQ do zablokowania rzędu przez cały czas trwania operacji aktualizacji?

Czy istnieje inny sposób, aby temu zaradzić?

+0

Jak ty obsługi współbieżności LINQ? – flesh

Odpowiedz

7

Jeśli masz autentyczne problemy z równoczesnymi aktualizacjami na tych samych danych, możesz rozważyć wykonanie całej operacji w transakcji - tj. Uzyskanie danych i. Dopóki traktujesz get/update/commit jako krótkotrwałą, operację atomową (tzn. Nie zatrzymuj się na wejście użytkownika w środku), to powinno być OK.

W szczególności przy izolowanym poziomie zserializowanym nikt nie może aktualizować danych, które mają blokadę odczytu (tzn. Wszystko, o co pytałeś). Jedynym problemem jest to, że może to prowadzić do scenariuszy zakleszczeń, jeśli różne zapytania odczytują dane w różnych zamówieniach. AFAIK, nie ma sposobu, aby uzyskać LINQ-SQL, aby wydać wskazówkę (UPDLOCK), co jest wstydem.

Może to być transakcja TransactionScope lub SqlTransaction, o ile są ustawione jako izolowane serializowalne (co jest domyślne dla TransactionScope).

+0

Witam, Dzięki za odpowiedź ... Próbowałem owijać ją w ramach transakcji, mam tylko inny wyjątek ... że operacja jest ofiarą impasu. Pozdrawiam, Ashish Sharma –

+0

Zastanawiam się, czy jest to impas blokady eskalacji czy impas innej kolejności?Jeśli pierwsza, jedna opcja (mimo że tracisz wiele korzyści LINQ) może polegać na wysyłaniu zapytań do danych za pomocą SP - możesz dołączyć podpowiedź UPDLOCK, zapobiegając problemom z eskalacją blokady. –

+0

(nadal przez LINQ, tzn. - powiedz projektantowi, że ten SP zwraca tę tabelę) –

1

możesz zajrzeć do Entity Framework, która wykonuje wszystko jako transakcję. Oto dwa podcasty, które mogą być również interesujące w Entity Framework.

DNRTV - part 1 - part 2

+1

LINQ-to-SQL również wykorzystuje transakcje; Problem polega na tym, że ta sama transakcja nie obejmuje get i set - ale to samo dotyczy LINQ-SQL lub EF. –

1

Dla tego rodzaju sytuacjach, czyli w przypadku gdy więcej niż jeden użytkownik może chcieć wprowadzić zmiany do tego samego rekordu/klient/zlecenia/cokolwiek lepiej jest budować „blokowania” w logika aplikacji, zamiast używać blokad bazy danych.

Użycie zamków DB do rozwiązania logicznego blokowania danych spowoduje wyświetlenie kupki nowych problemów. Lepszym rozwiązaniem jest posiadanie kolumn i/lub tabel, w których można wskazać, że zamówienie/klient/etc jest edytowane [przez użytkownika], aż do momentu zablokowania itd. Zapytanie do tej tabeli (lub kolumn), aby sprawdzić, czy klient/order/thing jest dostępne do edycji przed zezwoleniem innemu użytkownikowi na jego edycję.

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

+0

Czy możesz naprawić zepsuty link? – douglaslps

+0

Chciałbym móc. Niestety, Microsoft zaktualizował fora MSDN, a podczas tego procesu zabił wszystkie linki do postów/wątków, w tym powyższego. Wątek nadal istnieje, ale nie pamiętam, który to był ... – KristoferA