Article View: alt.pl.comp.lang.csharp
Article #716Re: Pytanie o prace z ADO.Net
From: Marek Janaszewski USUNTO. z adre...
Date: Mon, 05 Apr 2004 20:24
Date: Mon, 05 Apr 2004 20:24
108 lines
6974 bytes
6974 bytes
Maciej Łuszczyński wrote: [...] >> Jest jeszcze wymierająca metoda Embeded SQL. Czyli SQL wpisany >> pomiędzy zwykły kod. Takie coś jest także kompilowane i zamieniane >> na wywołania funkcji serwera. Komunikacja z zapytaniami następuje >> przez specjalne współdzielone zmienne. > Tego nie znam. Witam! Bo raczej jest nie używane, czasem dokumentacja o tym wspomina. AFAIK raczej do zastosowania z C++. [...] >> mięć jedną przewagę w przypadku updateing logic. Można spróbować nie >> modyfikować wszystkich pól. W przypadku optymistycznego module, może >> to oznacza, że nie napiszemy zmian dokonanych przez innych. Tak >> automagicznie działało ADO bez .NET . Ale na ADO.NET ta metoda jest >> strasznie kłopotliwa więc zwykle wysyła się wszystkie pola do >> modyfikacji. Za to rozwiązuje się te problemy szukają rekordu, który >> ma być zmodyfikowany uwzględniając wszystkie pola albo wersje >> rekordu. > Jakoś nie jestem przekonany, czy to taka zaleta - nadpisanie tylko > części pól. Włosy na karku mi się jeżą, jak myślę o takiej spójności. > Nie bardzo mi się podoba pomysł automagicznego wyszukiwania rekordu do > modyfikacji. Jestem za spójnym mechanizmem: PK i w oparciu o wartość > tego klucza wstawiamy bądź modyfikujemy. O ile dobrze zrozumiałem to tak właśnie działa zwykłe ADO samo przygotowując zapytania aktualizujące: http://www.microsoft.com/mspress/books/sampchap/5354f.asp Jeśli dobrze zrozumiałem, jak twierdzi autor to działa tak: 1. Do szukania rekordu w czasie aktualizacji używany jest klucz główny plus zmienione kolumny 2. Tylko zmienione kolumny są włączane do SET w zapytaniu UPDATE. Moim zdanie wygląda, że zapobiega ten sposób działa nadpisanie poprzedniej wartości na podstawie starej wartości pola. Czy to powoduje jak jakieś szczególne zagrożenie dla spójności to nie wiem. Integralność jest sprawdzana przez różne więzy na poziome samej bazy. Być może to nie jest dobry scenariusz dla aplikacji zdalnie przetwarzającej dane, ale dobry scenariusz dla pracy użytkownika z danymi. Użytkownik powinien przygotować dane, natomiast przetwarzanie bazy na podstawie tych danych powinno nastąpić w transakcji na serwera. Słyszałem od kogoś, że w Oraclu jest możliwość zakładanie blokad na pojedyncze pola. Dlaczego blokada na rekord daje spójność w bazie, a na pole nie? Jak modyfikacje w jednym rekordzie są robione na podstawie drugiego rekordu, oczywiście poza transakcjami. to problemy pojawią się takie same. W transakcja to nie ma się na czym zastanawiać. O ile się orientuje to jest sprawa bazy danych jak rozwiąże problem albo zgłosi dead lock (zakleszczenie). Czyli nie można zakończyć dwóch transakcji bo wynik jeden wpływa na drugą, a druga jeszcze nie skończona więc niepewna i na odwrót. [...] > Co do ryzyka napisania zmian wprowadzonych przez innego użytkownika: > na poziomie aplikacji, kiedy użytkownik wywołuje edycję, z serwera > pobierana jest ostatnia wersja rekordu. Dzięki temu minimalizujemy > ryzyko dwukrotnego wprowadzania tych samych zmian. Dane są załadowane do formularza na ekranie, użytkownik na podstawie istniejących danych wprowadza modyfikacje. Jeśli w tym czasie, ktoś inny wpadnie na ten sam pomysł i nastąpi zatwierdzenie jedno po drugim to procedury składowane na to zaradzą. Musi być przyjęta jakaś strategia, może być kto ostatni ten lepszy :-) > Jeśli zachodzi konieczność wyłącznej edycji rekordu, stosujemy albo > blokady na poziomie aplikacji (oczywiście wtedy sprawdzane jest to w > momencie rozpoczęcia edycji, nieco trudniej kontrolować ten mechanizm > w procedurach składowanych (a w zasadzie wymaga to większej uwagi)) > albo SELECT z odpowiednimi parametrami. Jest to rozwiązanie mniej skalowane i nie zalecane. Jeśli bym sobie pozwolił na blokowanie rekordu to wstawił bym na formularzu Timera i dał użytkownikowi określony czas na dokonanie zmian. Jeśli ktoś pójdzie na obiad to zablokuje pracę na części danych. Chyba jedna model optymistyczny jest lepszy i lepiej rozwiązywać problemy niż im zapobiegać. Poza tym takie rozwiązanie z blokowanie działa wtedy kiedy istnieje bezpośrednie połączenie z bazą danych, zajmuje zasoby serwera, generuje ruch na sieci. Nie mam z tak wymagającymi problemami do czynienia ale wydaje mi się, że model optymistyczny jest jednak lepszy jak proponuje literatura. Na pewno jest rozwiązanie bardziej skalowane i chyba jedyne do zastosowania w aplikacjach ASP. > Jeśli dobrze pamiętam bieg niniejszego wątku, początkowy problem > dotyczył aktualizacji i zapisu dużej liczby danych. IMO bezwzględnie > najszybsze będą > w tym przypadku procedury składowane, najwygodniejsze, jeśli da się je > połączyć z SQLDataAdapterem (a powinno to być możliwe). [...] No właśnie, być może skalowalność rozwiązania ma tu także znaczenia. Ale autor chyba bardziej miał problemy bardziej od strony kilenta niż serwera. Procedury składowane można z SQLDataAdapterem, jest rozwiązanie zalcena w książce, której link podałem wcześniej. Gdzieś wyczytałem, że zwracanie danych przez procedury składowane ma także swoją specyfikę w czasie odczytuj danych. MS SQL Server tworzy do tego sepcjany kursor. Przetłumaczyłem jego nazwę jako "wąż strażacki". Napełnia buffor rekordami i czego na jego opróżnianie nie prosząć kilenta o rozkazy wysyłania rekordów. Ma to być rozwiązanie bardziej skalowane bo zmiesza ruch tła w sieci. -- Pozdrawiam, Marek Janaszewski [ j_m...@gazeta.pl ]
Technical Details
Message-ID:
<c4snvs$1k48$3@news.atman.pl>Path:
mbox-mo1.pugleaf.net!archiver1.google.com!news2.google.com!news.maxwell.syr.edu!newsfeed.icl.net!newsfeed.fjserv.net!newsfeed.wirehub.nl!news.tele.dk!news.tele.dk!small.news.tele.dk!news-stoc.telia.net!217.209.241.210.MISMATCH!news-stod.telia.net!telia.net!news.nask.pl!news.atman.pl!not-for-mailReferences:
<c49ept$fbg$1@news.onet.pl> <c4h5rd$753$1@nemesis.news.tpi.pl> <c4jvdi$u99$1@news.atman.pl> <c3yeak2tpn37.atid4u2mtmu8$.dlg@40tude.net> <c4n8kf$bg0$2@news.atman.pl> <13m18xqz59hap.yfr7ocm8d9rf$.dlg@40tude.net>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!archiver1.google.com!news2.google.com!news.maxwell.syr.edu!newsfeed.icl.net!newsfeed.fjserv.net!newsfeed.wirehub.nl!news.tele.dk!news.tele.dk!small.news.tele.dk!news-stoc.telia.net!217.209.241.210.MISMATCH!news-stod.telia.net!telia.net!news.nask.pl!news.atman.pl!not-for-mail From: "Marek Janaszewski \(USUN_TO. z adresu!\)" <USUN_TO...@gazeta.pl> Newsgroups: alt.pl.comp.lang.csharp Subject: Re: Pytanie o prace z ADO.Net Date: Mon, 5 Apr 2004 22:24:39 +0200 Organization: ATMAN Lines: 109 Message-ID: <c4snvs$1k48$3@news.atman.pl> References: <c49ept$fbg$1@news.onet.pl> <c4h5rd$753$1@nemesis.news.tpi.pl> <c4jvdi$u99$1@news.atman.pl> <c3yeak2tpn37.atid4u2mtmu8$.dlg@40tude.net> <c4n8kf$bg0$2@news.atman.pl> <13m18xqz59hap.yfr7ocm8d9rf$.dlg@40tude.net> NNTP-Posting-Host: staticline702.toya.net.pl Mime-Version: 1.0 X-Trace: news.atman.pl 1081205565 53384 217.113.228.127 (5 Apr 2004 22:52:45 GMT) X-Complaints-To: use...@atman.pl NNTP-Posting-Date: Mon, 5 Apr 2004 22:52:45 +0000 (UTC) X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2800.1158 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1165 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit