Transakcje w ADO.NET cz. 1 (wstęp)

 

W nawiązaniu do mojego poprzedniego wpisu na blogu muszę niestety zlożyć małe sprostowanie. Tak zachwalałem zalety umieszczania serwisu na serwerze IIS, że uciekło mi to, że niestety z pomocą Visual Web Developer 2010 Express nie jest możliwe w tym przypadku debugowanie kodu. Wersja ta nie posiada bowiem bardzo ważnej opcji, jaką jest “Atach to process…”. Być może debugowanie z użyciem IIS tym razem w wersji Express wraz z nowościami SP1 do Visual Studio 2010 jest możliwe, jednak nie miałem się okazji z tym tematem jeszcze zapoznać, zatem zostawiam to zagadnienie na inny wpis.

Przechodząc do właściwej części postu, dzisiejszym (oraz pewnie kilku kolejnych postów ze względu na ilość wiedzy do przekazania) tematem będą transakcje w ADO.NET. Po co nam transakcje w aplikacji ? Otóż, na przykład, proces rejestracji nowego użytkownika w serwisie w tworzonej przeze mnie aplikacji opiera się o wstawienie danych do dwóch tabelek. Pierwsza z nich przechowuje dane użytkownika takie jak hasło czy e-mail, druga natomiast tworzy dla niego unikalny token, który zostanie wysłany użytkownikowi na podany przy rejestracji adres e-mail. Użytkownik w celu uzyskania dostępu do pewnych stron będzie musiał potwierdzić swoją rejestrację klikając w otrzymany link rejestracyjny z tokenem. Informacji o przyznanym tokenie nie przechowuję w tabeli użytkownika, gdyż być może okaże się, że token trzeba będzie zmienić, a jednocześnie przy tym zawsze dobrze znać historię przyzwanych tokenów (chociażby po to, aby wiedzieć kiedy użytkownik próbował się potwierdzić). Jednym słowem dane są w dwóch tabelkach dlatego, że jeden użytkownik może mieć przypisany do swojego konta więcej niż jeden token. Wszystko tutaj zależy od wymagań aplikacji tak więc nie da się podać jednej dobrej praktyki. Dla porządku zobaczmy jak wygląda to na wycinku diagramu z bazy danych:

diagram bazy danych uzytkownikow 

Przy tworzeniu nowego użytkownika chcemy uniknąć niespójności danych. Z racji tego, że dane wstawiane będą do dwóch oddzielnych tabelek może się tak zdarzyć, że po wstawieniu rekordu to tabeli tUsers wystąpi jakiś błąd (np. zerwanie połączenia) i pomimo tego, że dane powinny być wstawione również do tabeli tTokensHistory, nie odnajdziemy ich tam w takim przypadku. Doprowadzi to do sytuacji, że użytkownikowi nie zostanie przypisany token, w związku z czym nie będzie mógł on potwierdzić swojej rejestracji. Operacja utworzenia nowego użytkownika powinna zatem być zamknięta w transakcji. Transakcja wymusza, aby wszystkie operacje pomiędzy czasem jej rozpoczęcia i zakończenia zakończyły się sukcesem, lub żadna z nich nie powinna zostać zatwierdzona, czyli wszystkie operacje zostaną anulowane i żadne częściowe zmiany nie zostaną zapisane.

Oczywiście można utworzyć procedurę składowaną, która będzie realizowała operacje wstawienia danych do obu tabel i zamykała je w transakcji. Osobiście preferuję jednak innne podejście, polegające na zachowaniu jak największej atomowości przy wszystkich operacjach. Co jeśli bowiem okaże się, że konieczne okaże się wstawienie danych do jeszcze jednej tabeli albo kilku kolejnych ? Programista niekiedy nie musi być obeznany z tajnikami specyficznej bazy danych, a być może nie ma w pobliżu osoby potrafiącej daną zmianę przeprowadzić. “Wynieśmy” zatem transakcję o poziom wyżej (na co pozwala technologia ADO.NET). Niech pierwsza procedura umożliwia wstawienie danych to tabeli tUsers, a druga do tabeli tTokensHistory, a transakcja w której zostaną one wywołane znajdzie się nie tylko w aplikacji, ale dodatkowo nie w warstwie dostępu do danych, a w warstwie logiki biznesowej. Tym samym obowiązek utworzenia transakcji przechodzi na programistę. Preferuję takie podejście bowiem wyklikanie transakcji w VS z Intellisense jest niczym w porównaniu np. do czasu w jakim otwiera się Management Studio, nie mówiąc już o czasie update’u tam procedury.

Reklamy

2 Responses to Transakcje w ADO.NET cz. 1 (wstęp)

  1. Pingback: dotnetomaniak.pl

  2. Krzysztof says:

    W przypadku Visual Studio 2010 funkcja Attach to a Running Process występuje w wersjach: Pro, Premium, and Ultimate. Źródło MSDN, ale nie podam linka, ponieważ już zamknąłem zakłądkę ;] . W wersji Express był czerowny krzyżyk, ale nie wiem jak jest w przypadku Samego VS Web Development w pełnej krasie.

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

%d blogerów lubi to: