Jaki jest dokładny związek między transakcją w bazie danych a blokowaniem?

16

To skromne pytanie zadane w duchu pogłębiania mojej wiedzy; uprzejmie bądź łagodny w swojej odpowiedzi.

Jako programista aplikacji od dłuższego czasu wiem na pewnym poziomie, czym jest transakcja (używam ich cały czas). Pomijając chwilowe poziomy izolacji transakcji, na wysokim poziomie transakcja pozwala na całkowite lub całkowite ukończenie bloku pracy i pozwala na pewną izolację od innych działań modyfikujących bazę danych.

Wiem także, czym (w różnych bazach danych) jest blokada, a przynajmniej jak ona się zachowuje (jeśli zablokuję tabelę w sposób jawny, żaden inny proces ani wątek nie może zaktualizować niczego o tej tabeli).

Najbardziej wyraźnie nie jestem pewien: w różnych bazach danych, kiedy jawnie blokuję wiersz lub tabelę, czy stosuję dokładnie te same konstrukcje, które są używane przez narzędzia transakcyjne bazy danych pod osłonami, aby transakcja działała poprawnie?

To znaczy, przychodzi mi do głowy, że aby transakcja była atomowa i odizolowana, musiała blokować. Czy to zainicjowane przez transakcję, ukryte tranzytowanie blokowanie jest tym samym rodzajem blokowania, do którego różne bazy danych pozwalają mi uzyskiwać dostęp za pomocą konstrukcji takich jak polecenia SELECT FOR UPDATEjawne LOCK? Czy te dwie koncepcje są zupełnie inne?

Jeszcze raz przepraszam za naiwność tego pytania; Cieszę się, że mogę wskazać bardziej fundamentalne źródła.

Laird Nelson
źródło

Odpowiedzi:

12

kiedy jawnie blokuję wiersz lub tabelę, czy stosuję dokładnie te same konstrukcje, które są używane przez narzędzia transakcyjne bazy danych pod osłonami, aby transakcja działała poprawnie?

Tak. Jeśli nie byłoby to prawdą, wówczas twoje własne „blokowanie” byłoby ograniczone do innego podobnego „blokowania” i nie wchodziłoby w interakcje z własnym blokowaniem silnika. Tak więc zablokowałbyś wiersz w tabeli, aby nie mógł zostać zablokowany przez inną aplikację w ten sam sposób, ale blokada zostałaby zignorowana przez sam silnik. Te semantyki rzadko są pożądane. W większości przypadków aplikacja blokująca wiersz oznacza „zablokuj go przed jakimkolwiek sposobem dostępu / modyfikacji”. Notatka że mechanizmy blokujące, które są ściśle określony program zrobić istnieje, ponieważ są one użyteczne. Na przykład SQL Server ma blokady aplikacji .

przychodzi mi do głowy, że aby transakcja była atomowa i odizolowana, musiała blokować.

Blokowanie jest jednym ze sposobów na osiągnięcie tego. Główną alternatywą jest przechowywanie wersji. Obecnie większość baz danych obsługuje obie te funkcje (co oznacza również, że jeśli „zablokujesz” wiersz w aplikacji, ale inna transakcja używa wersji do odczytania wiersza, będzie go czytać, ponieważ blokowanie nie blokuje odczytów wersjonowanych).

Krążysz wokół koncepcji znanej w świecie implementacji bazy danych jako „dwufazowy protokół blokowania” . powiązany artykuł z Wikipedii jest dobrym początkiem. Jeśli chcesz przeczytać bardziej szczegółowe wyjaśnienia na ten temat, polecam udać się do biblioteki i poprosić o pożyczkę na przetwarzanie transakcji: koncepcje i techniki . Prawie każda baza danych jest w istocie implementacją tej książki.

Remus Rusanu
źródło
Być może możesz dodać o optymistycznej kontroli współbieżności
ypercubeᵀᴹ
Aha! Teraz rozmawiamy. Rzeczywiście, w głębi mojego umysłu czai się MVCC . Dziękuję za dobrze wyartykułowaną odpowiedź, świetne referencje i za poświęcenie czasu, aby naprawdę zagłębić się w moje pytanie.
Laird Nelson
3

Kilka informacji przed udzieleniem odpowiedzi na pytania:

Uwaga: Ma to związek z Microsoft SQL Server - RDBMS ........

  • Mówiąc najprościej, transakcja jest sekwencją pracy, która musi być wykonana jako pojedyncza jednostka logiczna w całości i musi zachować właściwości ACID.
  • Każdy system RDBMS musi zapewniać „funkcje blokowania”, które można wykorzystać do przeprowadzenia transakcji w całości, zachowując izolację transakcji i jej trwałość. Zapewnia to fizyczną integralność bazy danych.
  • Co najważniejsze, domyślnie transakcje są zarządzane na poziomie połączenia. Kiedy więc transakcja jest uruchamiana w połączeniu, wszystkie instrukcje T-SQL (S / I / U / D) wykonywane w tym połączeniu są częścią transakcji do czasu jej zakończenia. ( MARS jest obsługiwany inaczej)

Wróćmy do twoich pytań:

kiedy jawnie blokuję wiersz lub tabelę, czy stosuję dokładnie te same konstrukcje, które są używane przez narzędzia transakcyjne bazy danych pod osłonami, aby transakcja działała poprawnie?

Tak. Oznacza to, że należy zachować ostrożność przy ustalaniu kolejności danych, które zostaną zmodyfikowane i które spowodują spójny stan bazy danych. Innymi słowy, operacja DML powinna pozostawić bazę danych w spójnym stanie, który ogranicza się do reguł biznesowych organizacji. Mimo to RDBMS (tutaj SQL Server) może wymusić fizyczną integralność transakcji.

Z BOL: Blokowanie i wersjonowanie wiersza uniemożliwiają użytkownikom odczytanie nieprzydzielonych danych i uniemożliwiają wielu użytkownikom zmianę tych samych danych w tym samym czasie. Bez blokowania lub wersjonowania wierszy zapytania wykonywane względem tych danych mogą dawać nieoczekiwane wyniki, zwracając dane, które nie zostały jeszcze zatwierdzone w bazie danych.

Czy to zainicjowane przez transakcję, ukryte transakcje blokowanie jest tym samym rodzajem blokowania, do którego różne bazy danych pozwalają mi uzyskiwać dostęp poprzez konstrukcje takie jak SELECT FOR UPDATE lub jawne polecenia LOCK?

Wszystko na serwerze SQL jest zawarte w transakcji. Podczas uzyskiwania dostępu do danych RDBMS musi blokować w zależności od poziomu izolacji i operacji wykonywanych na danych. Sprawdź odpowiedź, aby uzyskać więcej informacji.

Kilka dobrych referencji:

Kin Shah
źródło
2

Powiedziałbym, że transakcje są częścią „interfejsu” bazy danych w tym sensie, że jako programista decydujesz, kiedy zaczynać, kończyć, co robić w ramach transakcji itp. Zamki, tak jak je widzę, należą do szczegółów implementacji i służy do synchronizacji dostępu do różnych obiektów. W większości przypadków sam silnik decyduje, co i na jak długo powinien być zamknięty. Istnieje wiele blokad na poziomie systemu, których nie można bezpośrednio modyfikować (na przykład silnik może blokować określone obszary pamięci). Nawet jeśli chodzi o blokady DML, wiele z nich dzieje się poza sceną (na przykład w celu zapewnienia integralności referencyjnej Oracle i, o ile pamiętam, SQLServer może zablokować odpowiedni wiersz w tabeli głównej, jeśli nowy rekord zostanie wstawiony do tabela szczegółów) w wyniku wyciągów DML wydanych w ramach transakcji.

Jeśli chodzi o transakcje, możesz oczekiwać mniej więcej spójnego zachowania od każdego RDMS, który twierdzi, że jest zgodny z SQL i obsługuje transakcje, ale jeśli chodzi o blokady, prawie każdy dostawca stosuje inną strategię i terminologię. O ile wiem, wspólną cechą wszystkich RMDS jest to, że współbieżność między transakcjami jest definiowana przez poziom izolacji, podczas gdy współbieżność między blokadami jest kontrolowana przez typy blokad (współdzielone, wyłączne itp.).

Podsumowując, zamki są niskopoziomowym mechanizmem kontrolującym spójność obiektów i współbieżność. Blokady mogą być wydawane podczas wykonywania instrukcji SQL. W zależności od implementacji poziomu izolacji transakcji silnik może nakładać różne typy blokad na obiekty, których dotyczy problem (wiersze, grupy wierszy, indeksy itp.). Dostępna jest ograniczona liczba poleceń do ręcznego wydawania blokad ( SELECT FOR UPDATE, LOCK). Blokady DML można eskalować (zależy od RDMS, na przykład w wierszu SQLServer-> strona-> partycja-> tabela). Blokady mogą być również wydawane przez silnik bazy danych podczas inicjowania połączenia, tworzenia kopii zapasowych, przywracania, ponownej kompilacji procedury / wyzwalacza / funkcji / itp., Uruchamiania, zamykania itp.

Nie jestem pewien, czy to odpowiada na twoje pytanie, ale mam nadzieję, że ma to sens.

a1ex07
źródło
Dziękuję za Twój komentarz. Jesteś zdecydowanie najbliższy jak dotąd. Nadal próbuję sprawdzić, czy transakcje są zawsze realizowane w kategoriach blokad, które są używane, powiedzmy, jawnie LOCKlub w SELECT FOR UPDATEinstrukcjach, lub za pomocą innego mechanizmu.
Laird Nelson
O ile mi wiadomo, BEGIN TRANSACTIONsama nie wydaje żadnych blokad. Blokady pojawią się po plikach DML w ramach transakcji.
a1ex07
Wyjaśnienie - miałem na myśli BEGIN TRANSACTION, że sam nie tworzy blokad DML; powinien faktycznie wydać kilka wewnętrznych blokad, ponieważ musi przydzielić zasoby, dodać wpis do tabeli systemowej (jeśli istnieje), która zawiera aktywne transakcje itp.
a1ex07
1

Użyję żargonu SQL Server, ale pojęcia powinny być takie same dla innych dostawców:

Każde wykonane polecenie jest wykonywane w ramach transakcji. Transakcję tę można otworzyć jawnie za pomocą BEGIN TRAN lub pośrednio przez silnik bazy danych. Przyczyną otwarcia niejawnej transakcji jest to, że silnik nadal musi zachować zgodność z ACID i możliwość wycofania.

Kiedy wybierzesz WYBIERZ AKTUALIZACJĘ, oznacza to po prostu, że podczas transakcji transakcja będzie utrzymywać określoną blokadę.

Matan Yungman
źródło
Dziękuję za Twój komentarz. Tyle wiem. Ale wciąż mam pytanie: kiedy ta transakcja zostanie otwarta, czy jej izolacja zostanie osiągnięta poprzez posiadanie własnych blokad? Jeśli tak, to czy te zamki są tymi samymi rodzajami zamków, które mogę wyraźnie nabyć? Czy też transakcja osiąga izolację za pomocą innych środków?
Laird Nelson
2
Tak, to ten sam mechanizm. Izolację uzyskuje się za pomocą blokad w obu trybach, tych samych blokad, które można jawnie nabyć. Różnica polega na tym, że jeśli nie otworzysz jawnie transakcji, blokady zostaną zwolnione po zakończeniu polecenia, podczas gdy w transakcji jawnej blokady będą utrzymywane do momentu zatwierdzenia (nie w 100% dokładne z powodu poziomów izolacji, ale to jest główny pomysł).
Matan Yungman
Dziękuję za Twój komentarz. Powodem, dla którego zadaję to pytanie, jest to, że gdzieś czytam, że niektóre bazy danych używają MVCC jako środka do realizacji transakcji ACID, co wydaje mi się być sposobem bez blokady. W takich przypadkach nie jestem zatem pewien, kiedy kiedykolwiek chciałbym jawnie wydać blokadę. Ale to prawdopodobnie osobne pytanie. :-)
Laird Nelson
@LairdNelson to poziom izolacji migawki dla SQL Server. Istniejący, ale nie domyślny mechanizm współbieżności. Jest to jednak domyślna wersja Oracle lub Postgresql, IIRC.
Marian
0

Blokada jest konieczna i tworzą bazę danych. Zapobiega to uszkodzeniu lub unieważnieniu danych, gdy wielu użytkowników próbuje czytać, podczas gdy inni piszą do bazy danych. Izolacja transakcyjna jest zwykle realizowana przez blokowanie wszystkiego, co jest dostępne w transakcji. Złe aplikacje projektowe często korzystają z koncepcji blokady bazy danych :) !! Aby uniknąć blokady, skoncentruj się na swoim FK i układzie danych.

Chodzi o KWAS: - przeczytaj to, a oczyścisz umysł! ACID to zestaw właściwości, które chcesz zastosować podczas modyfikowania bazy danych.

  • ** Atomowość
  • Konsystencja
  • Izolacja
  • Trwałość**

Transakcja to zestaw powiązanych zmian, które są wykorzystywane do uzyskania niektórych właściwości ACID. Transakcje są narzędziami do uzyskania właściwości ACID.

Atomowość oznacza, że ​​możesz zagwarantować, że cała transakcja się wydarzy, lub żadna z nich nie; możesz wykonywać złożone operacje jako jedna jednostka, wszystko lub nic, a awaria, awaria zasilania, błąd lub cokolwiek innego nie pozwoli ci znaleźć się w stanie, w którym nastąpiły tylko niektóre powiązane zmiany.

Spójność oznacza, że ​​gwarantujesz spójność swoich danych; żadne z ograniczeń dotyczących powiązanych danych nigdy nie zostanie naruszone.

Izolacja oznacza, że ​​jedna transakcja nie może odczytać danych z innej transakcji, która nie została jeszcze zakończona. Jeśli dwie transakcje są wykonywane równolegle, każda z nich zobaczy świat tak, jakby były wykonywane sekwencyjnie, a jeśli jedna będzie musiała odczytać dane zapisane przez inną, będzie musiała poczekać, aż druga zostanie zakończona.

Trwałość oznacza, że ​​po zakończeniu transakcji gwarantuje się, że wszystkie zmiany zostały zapisane na trwałym nośniku (takim jak dysk twardy), a także fakt, że transakcja została zakończona.

Transakcje są więc mechanizmem gwarantującym te właściwości; są sposobem na grupowanie powiązanych działań, tak aby grupa operacji mogła mieć charakter atomowy, dawać spójne wyniki, być izolowana od innych operacji i być trwale rejestrowana.

Up_One
źródło
Dzięki za komentarz. Jestem przynajmniej świadomie świadomy właściwości ACID. Nadal nie jestem do końca LOCKpewien : czy transakcje implementują ACID przy użyciu tego samego rodzaju blokad, których mogę używać bezpośrednio za pomocą jawnych instrukcji, czy robią to przy użyciu innego mechanizmu?
Laird Nelson
Bazy danych oferują szereg poziomów izolacji transakcji, które kontrolują stopień blokowania występujący podczas wybierania danych.
Up_One