Spisie treści
Każda aplikacja, która zawiera bazę danych, musi być zgodna z charakterystyką ACID, w aplikacjach i profesjonalnych menedżerach baz danych pojęcie ACID odnosi się do cech lub właściwości, które gwarantują, że transakcje w bazach danych są przeprowadzane bezpiecznie i można je konfigurować. W szczególności ACID oznacza atomowość, spójność, izolację i trwałość.Transakcja w bazie to np. wstawienie rekordu lub, jeśli postrzegamy to jako model biznesowy, dodanie nowego klienta, modyfikacja produktu. Transakcje zawsze powodują zmianę, wstawienie, modyfikację, usunięcie, zapytanie nie jest transakcją, ponieważ nie powoduje zmian.
Określanie właściwości ACID
Atomowość
Jest to właściwość, która gwarantuje i weryfikuje, czy transakcja została wykonana, czy nie i ta właściwość wskazuje, że jeśli operacja nie zostanie wykonana kompletnie, to jest anulowana, na przykład załóżmy, że wstawiamy rekord i serwer się zawiesza, rekord jest zapisany w środku, to ze względu na atomowość zapis ten nie zostanie zarejestrowany.
Inny przykład, jeśli dokonywana jest płatność online i kwota jest potrącana z naszego konta, ale płatność nie udaje się lub system ulega awarii, to transakcja jest anulowana, a baza danych jej nie rejestruje.
Konsystencja
To właśnie ta właściwość gwarantuje, że transakcje, które można bezproblemowo zakończyć, zostaną zrealizowane. Ta koncepcja ma związek z integralnością bazy danych. Zapobiega to zmianie i utracie znaczenia danych lub pozostawaniu bez odniesienia, na przykład klient nie może zostać usunięty, gdy w pewnym momencie dokonał zakupu. Jeśli chcesz usunąć klienta, musisz najpierw usunąć wszystkie faktury i dane związane z tym klientem.
Izolacja
Jest to właściwość, która gwarantuje, że jeśli dwie lub więcej transakcji wystąpią w tym samym czasie, zostaną one wykonane jedna po drugiej, a jeśli są wykonywane równolegle, każda z nich będzie to robić niezależnie od drugiej, aby uniknąć ewentualnych błędów.
Trwałość
To własność jest odpowiedzialna za zagwarantowanie, że transakcja została dokonana, a zmiany dokonane przez transakcję są trwałe, nawet w przypadku jakichkolwiek problemów, takich jak brak prądu, czy awaria systemu.
MySQL obsługuje format InnoDB, który jest formą przechowywania danych dla MySQL, zawartym jako standardowy format tabeli we wszystkich dystrybucjach MySQL. Ten format obsługuje transakcje typu ACID i integralność referencyjną.
Zamierzamy zrobić kilka przykładów implementacji ACID za pomocą Mysql, zapytania mogłyby następnie zostać zaimplementowane w dowolnym języku programowania. W tej bazie każdy użytkownik będzie miał poziom uprawnień i akcji, które może wykonać w systemie firmy. Skupimy się tylko na tej funkcjonalności.
Zaczniemy od stworzenia bazy danych Baza danych firmy z phpmyadmin, następnie utworzymy tabelę użytkowników i wybierzemy silnik przechowywania InnoDB.
- Struktura tabeli dla tabeli `users` CREATE TABLE IF NOT EXISTS` users` (`userid` int (10) NOT NULL,` name` varchar (150) DEFAULT NULL) ENGINE = InnoDB AUTO_INCREMENT = 4 DEFAULT CHARSET = latin1;Dodajemy trochę danych do tabeli użytkowników
INSERT IN TO `users` (` userid`, `name`) VALUES (1, 'Carlos Alberte'), (2, 'Pablo Callejos'), (3, 'Ana Bolena');W tym przypadku tworzymy klucz podstawowy tabeli użytkowników, który będzie identyfikatorem użytkownika
- Indeksy tabeli `users` ALTER TABLE` users` ADD PRIMARY KEY (`userid`);Następnie stworzymy tabelę poziomów
- Struktura tabeli dla tabeli `levels` CREATE TABLE IF NOT EXISTS` levels` (`levelid` int (11) NOT NULL,` level` varchar (50) DEFAULT NULL) ENGINE = InnoDB AUTO_INCREMENT = 4 DEFAULT CHARSET = latin1;Dodajemy trochę danych do tabeli poziomów
WSTAWIĆ W „poziomy” („id poziomu”, „poziom”) WARTOŚCI (1, „Podstawowy”), (2, „Średniozaawansowany”), (3, „Zaawansowany”);Następnie tworzymy tabelę uprawnień, w której wskażemy poziom uprawnień każdego użytkownika
- Struktura tabeli dla tabeli `uprawnienia` CREATE TABLE IF NOT EXISTS` przywileje` (`idprivilege` int (11) NOT NULL,` idlevel` int (11) NOT NULL DEFAULT '0', `idusuario` int (11) NOT NULL ) SILNIK = InnoDB AUTO_INCREMENT = 4 DOMYŚLNY ZESTAW ZNAKÓW = latin1;Dodajemy trochę danych do tabeli uprawnień
INSERT IN TO „uprawnienia” („uprawnienia”, „id poziomu”, „identyfikator użytkownika”) WARTOŚCI (1, 1, 1), (2, 2, 3), (3, 1, 2);Następnie dodajemy relacje z edytora SQL, przypisuję klucz obcy, który łączy uprawnienia i tabelę użytkowników poprzez identyfikator użytkownika i klucz obcy, który łączy uprawnienia z poziomami poprzez identyfikator poziomu.
- Filtry dla tabeli `uprawnienia` ALTER TABLE` przywileje` ADD CONSTRAINT `levellfk` FOREIGN KEY (`levelid`) REFERENCES `levels` (`levelid`), ADD CONSTRAINT `privilegesfk` FOREIGN KEY (`userid`) REFERENCES `użytkownicy ` (`identyfikator użytkownika`);Następnie sprawdzamy bazę danych, aby sprawdzić, czy dane są prawidłowe
SELECT użytkownicy.nazwa, poziomy.poziom FROM użytkownicy, poziomy, uprawnienia WHERE uprawnienia.idlevel = poziomy.idpoziomu ANDusers.identyfikator użytkownika = uprawnienia.idużytkownikaZobaczmy jak to działa Następnie spróbujemy wstawić uprawnienia do użytkownika i poziomu, które nie istnieją.
Instrukcja będzie następująca INSERT INTO przywileje VALUES (privilegeid, userid, levelid); Zatem
INSERT INTO przywileje WARTOŚCI (6, 8,10);Daje to błąd, ponieważ klucz obcy identyfikatora użytkownika w tabeli uprawnień stworzyłby niespójność, jeśli dodamy użytkownika, który nie istnieje w tabeli users, tutaj unikamy błędu, z formatem MySam dane zostałyby zapisane bez problemów.
Następnie spróbujemy usunąć użytkownika z tabeli użytkowników:
USUŃ Z `użytkowników` GDZIE userid = 3Przy wykonywaniu instrukcji SQL da nam błąd, ponieważ klienta nie da się usunąć bo ma dane w innych tabelach w tym przypadku klient o id 3 jest w tabeli uprawnień, jeśli chcemy go usunąć musimy go najpierw usunąć ze wszystkich stolików i po stoliku klienta.
Aby usunąć tego typu rekordy z kluczami obcymi, w WODOSPAD, w którym wszystkie rekordy związane z określonym zapytaniem zostaną usunięte we wszystkich tabelach, w których mają relacje klucza obcego. Aby przeprowadzić tę transakcję korzystamy z funkcji PRZY USUWANIU KASKADY.
Pierwszą rzeczą będzie zezwolenie na kaskadowe usuwanie, pamiętaj, że przy uruchamianiu domyślnie typem referencyjnym jest OGRANICZAĆ co wskazuje, że danych w tym polu tabeli nie można zaktualizować ani usunąć, ze względów bezpieczeństwa żadne zdanie, które zostanie wykonane, nie będzie w stanie wykonać żadnej transakcji, dlatego zmieniamy uprawnienia do modyfikacji i usunięcia.
ALTER TABELA `uprawnienia` ADD CONSTRAINT` przywilejefk` KLUCZ OBCY (`userid`) REFERENCES` użytkownicy` (`userid`) ON USUŃ KASKADOWĄ PRZY AKTUALIZACJI KASKADOWEJ;Ponownie wykonujemy zapytanie SQL
USUŃ Z `użytkowników` GDZIE userid = 3Następnie możemy wykonać zapytanie sql, aby sprawdzić, czy nie ma go już w żadnej tabeli:
SELECT użytkownicy.nazwa, poziomy.poziom FROM użytkownicy, poziomy, uprawnienia WHERE uprawnienia.idlevel = poziomy.idlevel AND użytkownicy.identyfikator = uprawnienia.identyfikatorUżytkownik 3 został usunięty z tabeli użytkowników, a także z tabeli uprawnień, ponieważ identyfikator użytkownika miał tam klucz obcy.
To samo dotyczy aktualizacji podczas modyfikacji, można je kaskadować, aby zachować referencyjną integralność w Mysql i relacje między tabelami.
Zobaczmy, co się stanie, jeśli dodamy nieprawidłowe dane we wstawce łańcucha, na przykład dodamy użytkownika, ale dodając uprawnienia otrzymujemy zły id
WSTAWIĆ WARTOŚCI użytkowników (5, „Julia Montaña”); INSERT INTO uprawnienia (`privilegeid`,` levelid`, `userid`) VALUES (6, 2, 6);W takim przypadku użytkownik zostanie zapisany, ale nie jego uprawnienia, ponieważ identyfikator 6 nie istnieje w tabeli użytkowników.Podobał Ci się i pomógł ten samouczek?Możesz nagrodzić autora, naciskając ten przycisk, aby dać mu pozytywny punkt