Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

ADO.NET Konflikty i kłopoty

Podobne prezentacje


Prezentacja na temat: "ADO.NET Konflikty i kłopoty"— Zapis prezentacji:

1 ADO.NET Konflikty i kłopoty
Tomasz Kopacz Microsoft Professional Developer Days 2004

2 Konflikty Na poziomie „interfejsu użytkownika”
Dwie osoby zmieniają ten sam wiersz Rozwiązanie: Odpowiedni DataAdapter Mechanizm „blokad aplikacyjnych” na poziomie SQL Server Na poziomie mechanizmów bazy Konflikt równolegle wydawanych poleceń Stracone aktualizacje, odczyty widmo itp Transakcje bazodanowe EnterpriseServices

3 Architektura ADO (dokładniej – SQLClient)
DataSet Własne mechanizmy Provider danych dla Sql Server… SqlDataAdapter CommandBuilder IDataReader Sql Server SqlConnection SqlCommand SqlDataParameter SqlException SqlError SqlTransaction

4 DataAdapter SelectCommand, InsertCommand, UpdateCommand, DeleteCommand
Można w transakcji CommandBuilder Kosztowne! (projektant, dodatek itp.) Wsparcie w DataSet DataRowVersion – wersja wiersza Original, Current, Proposed, Default Podstawienie z kolekcji Parameters SqlCommand SourceVersion DataRowState – stan wiersza Added,Deleted,Modified,Unchanged Detached

5 Strategie rozwiązywania konfliktów
Optymistyczna! Porównujemy tylko klucz główny Zakładamy zmiany w każdym polu Standardowa Wszystkie pola Timestamp Pole charakterystyczne? Różnice w wydajności zależą od łącza do SQL, wielkości danych itp. 100 MB – ok. 19% timestamp szybszy VPN 128 kb – nawet 60% Pesymistyczna Blokada w transakcji od czasu odczytu

6 Timestamp i wykrywanie konfliktów
Długie dane TS xxxxxxxxxx aa OK! xxxxxxxxxx aa yyyyyy bb Zapis yyyyyy bb Konflikt xxxxxxxxxx aa zzzzzz cc Czas Klient A Klient B

7 Typy aktualizacji „Wszystkie albo żaden” Tylko wiersze bez konfliktów
Trzeba aktualizację zamknąć w transakcji Tylko wiersze bez konfliktów ContinueUpdateOnError=true (Sprawdzamy: HasErrors/GetErrors) Pesymistyczne = blokada na tabeli Wystartować transakcję przed wypełnieniem DataSet (I zastanowić się czy nie da się postąpić inaczej)

8 Transakcje bazodanowe
Zapewniają ACID Obiekt SqlTransaction „Pobierany” z połączenia Przypisywana do polecenia Tryby izolacji Podpowiedzi przy poleceniach SQL NOLOCK, READCOMMITTED,REPEATABLEREAD, SERIALIZABLE TABLOCK (jak ktoś naprawdę musi!) Temat w pomocy: Locking Hints

9 Tryb izolacji a problemy współbieżności
Poziom izolacji (wg „kosztowności”) ReadUncommitted ReadCommited RepeatableRead Serializable Problem z współbieżnością Stracone aktualizacje X Odczyt właśnie zmienianych rekordów ? OK Niespójne odczyty Odczyty rekordów „widmo”

10 Demo – praca z wersjami w DataSet
Blokady optymistyczne Aktualizacje wszystkich które można Aktualizacje tylko wszystkich lub żadnego Pokazanie użytkownikowi zmienionych danych Wersje DataSet i okolice Blokady pesymistyczne

11 Własne transakcje Problem: Rozwiązanie:
Okno „tylko dla jednego użytkownika” Rozwiązanie: Transakcje aplikacyjne w SQL Server sp_getapplock nazwa_zasobu, tryb, właściciel, timeout sp_releaseapplock nazwa_zasobu, właściciel Można używać Wewnątrz sesji (jednego połączenia) Nie lokalne – trzeba użyć np. mutex-a Wewnątrz transakcji

12 Demo - własne transakcje aplikacyjne
Blokada okna Trwa aż się zwolni zasób Lub – sesja zostanie zamknięta

13 Enterprise Services? Problem: Rozwiązanie:
Transakcja obejmuje kilka etapów Połączeń, sekwencja operacji bazodanowych itp Złożona logika i wygodniej byłoby dodać cechę „wykonuj w transakcji” Kod złożony i zmiany trzeba wycofywać „ręcznie” Rozwiązanie: Obiekt dziedziczący z EnterpriseServices Duże możliwości (kolejki, pula itp.) Transakcje Połączenie „wylistowane” w transakcji Kod „kompensacyjny” Rejestracja regsvcs.exe System.EnterpriseServices.RegistrationHelper.InsallAssembly

14 Serwerowy obiekt ServicedComponent
Referencja do System.EnterpriseServices Klasa dziedziczy z ServicedComponent [assembly: ApplicationActivation(ActivationOption.Server/Library)] Atrybuty klasy Transaction Disabled NotSupported Required RequiresNew Supported Atrybuty metody: [ AutoComplete(true) ] Lub: ContextUtil.SetAbort()/.SetComplete();

15 Własny kod kompensujący
Problem: Używany obiekt nie jest „świadomy transakcji” Długa operacja (szkoda zasobów SQL-a) Rozwiązanie: Kod kompensujący System.EnterpriseServices.CompensatingResourceManager Główne klasy Clerk Compensator LogRecord [assembly: ApplicationCrmEnabled] ActivationOption.Server

16 Demo - EnterpriseServices
Transakcje automatyczne Transakcje ręczne Kod kompensacyjny Plik + kasowanie Uwagi! Interfejs Raz skompilować oddzielny DLL – ułatwi pracę Dodać do GAC Łatwiej znajdzie formatter itp Referencje do DLL a nie do projektu

17 Zdalnie? Problem: Rozwiązanie: Typy wywołań: Klient:
Obiekt EnterpriseServices na zdalnej maszynie Rozwiązanie: Remoting Własny proces nasłuchujący (remoting) + wrapper Umieścić w /bin aplikacji WWW + drobne zmiany w web.config/remoting.config Uwaga! ASPNET nie zarejestruje samo COM+ System.UnauthorizedAccessException: Odmowa dostępu do klucza rejestru HKEY_CLASSES_ROOT\EnterpriseDemoSrv.EntComp. Typy wywołań: SAO (SingleCall/Singleton) CAO (Jak „normalne” COM/.NET) Klient: Activator.GetObject(typeof(…),"uri");

18 Szybkie demo – zdalne wywołanie
Pliki dll kopiowane do bin Zmiany w web.config Prawa dla anonimowego użytkownika! Klient – interfejs + Activator.GetObject

19 Warto jeszcze wiedzieć
SWC (Services Without Components) COM+ 1.5 (XP, 2003 Server) BYOT (Bring Your Own Transaction) CreateWithTransaction, CreateWithTipTransaction Windows 2003 – domyślnie COM+ i DTC zablokowane Add/Remove Windows Components Application Server Enable network COM+ access Enable network DTC access Component Services – (…) - Security Configuration Prościej używać logowanie SQL Jeżeli coś nie działa: Uprawnienia… Usunąć cały komponent (okno Component Services) W Event Log -> co nie działa

20 Cechy omawianych mechanizmów…
Konflikty Timestamp – najtańszy; Porównywanie pól – gdy nie można zmienić schematu Inne charakterystyczne pole DataSet ma olbrzymie możliwości… Blokady aplikacyjne w SQL Co jak klient padnie? master.syslockinfo/master.sysprocesses kodowane – kod połaczenia; do oddzielnej tabeli Ale i tak – blokady sesyjne zwalniane są w momencie zakończenia (padu) sesji Klient/Serwer – transakcje lokalne Szybkie, ale… „ręczne” EnterpriseServices Gdy mamy taką możliwość Nawet „na kliencie” Wolniejsze Proste w użyciu - wystarczy deklaracja atrybutu Łatwa migracja na „n warstw”

21 Co zmieni Yukon Kursory po stronie serwera SqlDependency
Ale nadal – nie używać  SqlDependency Jedno połączenie – wiele równoległych poleceń Mniejsza rola transakcji w EnterpriseServices? Indigo jest ciekawym produktem  I zawiera funkcjonalność EnterpriseServices

22 Microsoft Professional Developer Days 2004
Dziękuję za uwagę Pytania: Prezentacja + przykłady do ściągnięcia dostępne na Microsoft Professional Developer Days 2004


Pobierz ppt "ADO.NET Konflikty i kłopoty"

Podobne prezentacje


Reklamy Google