2011-01-13 18 views
8

Jakiś czas temu napisałem aplikację używaną przez wielu użytkowników do obsługi tworzenia transakcji. Nie zajmowałem się programowaniem od jakiegoś czasu i nie pamiętam, jak zarządzałem współbieżnością między użytkownikami. W związku z tym szukam porady w zakresie projektowania.Jaki jest najlepszy sposób zarządzania współbieżnością w aplikacji dostępu do bazy danych?

Oryginalna aplikacja miała następujące cechy:

  • jeden ciężki klienta na użytkownika.
  • Jedna baza danych.
  • Dostęp do bazy danych dla każdego użytkownika do wstawiania/aktualizacji/usuwania transakcji.
  • Siatka w aplikacji odzwierciedla tabelę transakcji. Ta siatka jest aktualizowana za każdym razem, gdy ktoś zmieni umowę.
  • Używam WPF.

Oto co zastanawiam:

  1. Czy mam rację sądząc, że nie powinien dbać o połączenia do bazy danych dla każdej aplikacji? Biorąc pod uwagę, że jest singleton w każdym, oczekiwałbym jednego połączenia na klienta bez problemu.

  2. Jak mogę zapobiec współbieżności dostępu? Myślę, że powinienem zablokować podczas modyfikowania danych, jednak nie pamiętam, jak to zrobić.

  3. Jak skonfigurować siatkę do automatycznego aktualizowania po każdej aktualizacji mojej bazy danych (na przykład przez innego użytkownika)?

Z góry dziękujemy za pomoc!

+3

Co rodzaj bazy danych? –

+0

Co używasz jako interfejsu użytkownika? ASP.NET? WinForms? WPF? Silverlight? – Jeff

+0

Używam WPF. Dodałem go w opisie. dzięki – Goul

Odpowiedz

2
  1. Rozważ wykorzystanie łączenia połączeń w celu zmniejszenia liczby połączeń. Zobacz: http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

  2. zablokuj tak późno jak to możliwe i zwolnij jak najszybciej, aby zmaksymalizować współbieżność. Możesz użyć TransactionScope (zobacz: http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx i http://blogs.msdn.com/b/dbrowne/archive/2010/05/21/using-new-transactionscope-considered-harmful.aspx), jeśli masz wiele działań db, które muszą iść razem w celu zarządzania spójnością lub po prostu obsłużyć je w przechowywanym procencie DB. Zachowaj proste zapytanie. Postępuj zgodnie z poniższymi wskazówkami, aby zrozumieć, w jaki sposób blokowania pracy i jak zmniejszyć twierdzenie zasobów i impasu: http://www.devx.com/gethelpon/10MinuteSolution/16488

  3. nie jestem pewien inny db, ale dla SQL, można użyć SQL zależności, patrz http://msdn.microsoft.com/en-us/library/a52dhwx7(v=vs.80).aspx

+0

Dzięki za odpowiedź Jimmy! To rzuciło mi trochę światła na wszystkie moje pytania, dzięki za artykuły. – Goul

3

Współbieżność jest zwykle przyznawana przez DBMS za pomocą blokad. Blokady są rodzajem semafora, które przyznają wyłączną blokadę do określonego zasobu i umożliwiają innym dostępom blokowanie lub umieszczanie w kolejce (ograniczone tylko w przypadku korzystania z nieprzesorowanych odczytów).

Liczba samych połączeń nie stanowi problemu, gdy nie osiągasz wysokości, na której możesz dotknąć ustawienia max_connections w Twoim systemie DBMS. W przeciwnym razie może pojawić się problem z połączeniem się z nim w celu konserwacji lub wyłączenia go.

Systemy DBMS zwykle używają koncepcji blokad tabel (MyISAM) lub blokad wierszy (InnoDB, większość innych systemów zarządzania relacjami). Rodzaj blokady określa objętość zamka. Blokady stołów mogą być bardzo szybkie, ale zwykle są uważane za gorsze od blokad na poziomie wiersza.

Blokady poziomu wiersza występują wewnątrz transakcji (domniemana lub jawna). Podczas ręcznego uruchamiania transakcji rozpoczynasz zakres transakcji. Do momentu ręcznego zamknięcia zakresu transakcji wszystkie wprowadzone zmiany będą atrybutami tej transakcji. Zmiany, które wprowadzisz, będą również zgodne z ACID paradigm.

Zakres transakcji i sposób jej używania to temat o wiele za długi na tę platformę, jeśli chcesz, mogę opublikować linki, które zawierają więcej informacji na ten temat.

W przypadku automatycznych aktualizacji większość baz danych obsługuje pewien rodzaj mechanizmu wyzwalającego, który jest kodem uruchamianym przy określonych działaniach w bazie danych (na przykład utworzeniem nowego rekordu lub zmianą rekordu).Możesz umieścić swój kod w tym wyzwalaczu. Jednak powinieneś poinformować tylko o otrzymaniu aplikacji, a nie "zrobić" zmian z poziomu wyzwalacza, nawet jeśli umożliwi to język. Pamiętaj, że akcja, która spowodowała uruchomienie kodu, jest zawieszona, dopóki nie skończysz z kodem aktywacyjnym. Oznacza to, że chudy spust jest najlepszy, jeśli w ogóle jest potrzebny.

+0

Dzięki za pomoc TME, jest to bardzo pouczające i odpowiadające mi mechanizmy współbieżności. Pozdrowienia – Goul

Powiązane problemy