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 UPDATE
jawne 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.
źródło
Kilka informacji przed udzieleniem odpowiedzi na pytania:
Uwaga: Ma to związek z Microsoft SQL Server - RDBMS ........
Wróćmy do twoich pytań:
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.
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ź tę odpowiedź, aby uzyskać więcej informacji.
Kilka dobrych referencji:
źródło
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.
źródło
LOCK
lub wSELECT FOR UPDATE
instrukcjach, lub za pomocą innego mechanizmu.BEGIN TRANSACTION
sama nie wydaje żadnych blokad. Blokady pojawią się po plikach DML w ramach transakcji.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.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ę.
źródło
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.
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.
źródło
LOCK
pewien : 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?