MySQL ACID-Transaktionen und referenzielle Integrität durchführen

Jede Anwendung, die eine Datenbank enthält, muss den ACID-Merkmalen entsprechen. In den Anwendungen und professionellen Datenbankmanagern bezieht sich das ACID-Konzept auf die Merkmale oder Eigenschaften, die gewährleisten, dass die Transaktionen in den Datenbanken sicher ausgeführt werden. und zuverlässig. Insbesondere steht ACID für Atomicity, Consistency, Isolation und Durability.

panta01.png

Bei einer Transaktion in einer Datenbank handelt es sich beispielsweise um das Einfügen eines Datensatzes oder, wenn es sich um ein Geschäftsmodell handelt, um das Hinzufügen eines neuen Kunden, um das Ändern eines Produkts. Transaktionen führen immer zu einer Änderung, Einfügung, Änderung, Löschung. Eine Abfrage ist keine Transaktion, da sie keine Änderungen hervorruft.

Angabe der ACID-Eigenschaften

Atomarität

Es ist die Eigenschaft, die garantiert und überprüft, ob die Transaktion ausgeführt wurde oder nicht. Diese Eigenschaft gibt an, dass eine Operation abgebrochen wird, wenn sie nicht abgeschlossen wurde. Nehmen wir beispielsweise an, wir fügen einen Datensatz ein und der Server fällt aus, und ein Datensatz wird aufgezeichnet in der Hälfte wird diese Aufzeichnung dann nach Atomizität nicht aufgezeichnet.

Ein weiteres Beispiel: Wenn eine Online-Zahlung getätigt wird und der Betrag von unserem Konto abgezogen wird, die Zahlung jedoch fehlschlägt oder das System abstürzt, ist die Transaktion Zimt und die Datenbank zeichnet sie nicht auf.

Konsistenz

Es ist die Eigenschaft, die garantiert, dass Transaktionen ausgeführt werden, die ohne Probleme enden können. Dieses Konzept hat mit der Integrität der Datenbank zu tun. Es verhindert, dass die Daten geändert werden und ihre Bedeutung verlieren oder ohne Bezug bleiben. Beispielsweise kann ein Kunde nicht ausgeschlossen werden, während er zu einem bestimmten Zeitpunkt einen Kauf getätigt hat. Wenn Sie den Kunden löschen möchten, müssen zuerst alle Rechnungen und Daten gelöscht werden, die sich auf diesen Kunden beziehen.

Isolierung

ist die Eigenschaft, die garantiert, dass wenn zwei oder mehr Transaktionen gleichzeitig ausgeführt werden und wenn sie parallel ausgeführt werden, dies unabhängig voneinander geschieht, um mögliche Fehler zu vermeiden.

See also  Adressierung von MAC-gefiltertem DHCP in Windows Server 2008

Haltbarkeit

Es ist die Eigenschaft, die dafür verantwortlich ist, dass eine Transaktion garantiert wurde, und die durch die Transaktion vorgenommenen Änderungen sind dauerhaft, auch bevor Probleme wie fehlender Strom oder Systemausfälle auftreten.

MySQL unterstützt das InnoDB-Format, eine Form der Datenspeicherung für MySQL, das in allen MySQL-Distributionen als Standardtabellenformat enthalten ist. Dieses Format unterstützt Transaktionen vom Typ ACID und referenzielle Integrität.

, las consultas luego podrían implementarse en cualquier lenguaje de programación. Wir werden einige Beispiele für die Implementierung von ACID mit MySQL machen , die Abfragen könnten dann in jeder Programmiersprache implementiert werden. In dieser Datenbank verfügt jeder Benutzer über eine Reihe von Berechtigungen und Aktionen, die im System des Unternehmens ausgeführt werden können. Wir werden uns nur auf diese Funktionalität konzentrieren.

Zunächst erstellen wir eine EmpresaDB- Datenbank aus phpmyadmin, dann erstellen wir eine Benutzertabelle und wählen die InnoDB-Speicher-Engine aus.

panta02.png

 - Tabellenstruktur für die Tabelle "Benutzer" TABELLE ERSTELLEN, WENN KEINE 'Benutzer' existieren ( `userid 'int (10) NOT NULL, `name` varchar (150) DEFAULT NULL) ENGINE = InnoDB AUTO_INCREMENT = 4 DEFAULT CHARSET = latin1; 

Wir fügen der Benutzertabelle einige Daten hinzu

 INSERT IN `users` (` userid`, `name`) VALUES (1, "Carlos Alberte"), (2, "Pablo Callejos"), (3, "Ana Bolena"); 

In diesem Fall erstellen wir den Primärschlüssel der Benutzertabelle, die der Benutzer sein wird

 - Indizes der Tabelle "Benutzer" ALTER TABLE `users` ADD PRIMARY KEY (` userid`); 

Als nächstes werden wir die Tabellenebenen erstellen

 - Tabellenstruktur für die Tabellenebenen TABELLE ERSTELLEN, WENN KEINE "Ebenen" existieren ( `idnivel` int (11) NICHT NULL, `level` varchar (50) DEFAULT NULL) ENGINE = InnoDB AUTO_INCREMENT = 4 DEFAULT CHARSET = latin1; 

Wir fügen den Tabellenebenen einige Daten hinzu

 INSERT IN `level` (` idnivel`, `level`) WERTE (1, "Basic"), (2, "Mittelstufe"), (3, 'Fortgeschritten'); 

Wir erstellen unterhalb der Privilegientabelle, in der wir die Berechtigungsstufe jedes Benutzers angeben

 - Tabellenstruktur für die Tabelle "Privilegien" TABELLE ERSTELLEN, WENN KEINE "Privilegien" existieren ( `idprivilegio` int (11) NICHT NULL, `idnivel` int (11) NOT NULL DEFAULT '0', `userid` int (11) NOT NULL) ENGINE = InnoDB AUTO_INCREMENT = 4 DEFAULT CHARSET = latin1; 

Wir fügen der Privilegientabelle einige Daten hinzu

 INSERT IN `privileges` (` idprivilegio`, `idnivel`,` userid`) VALUES (1, 1, 1), (2, 2, 3), (3, 1, 2); 

Anschließend fügen wir die Beziehungen aus dem SQL-Editor hinzu, weisen einen Fremdschlüssel zu, der die Tabellenberechtigungen und Benutzer durch userid in Beziehung setzt, und den Fremdschlüssel, der Berechtigungen mit Ebenen durch idnivel in Beziehung setzt.

 - Filter für die Privilegientabelle ALTER TABLE "Privilegien" ADD CONSTRAINT `nivelfk` FOREIGN KEY (` idnivel`) REFERENZEN `levels` (` idnivel`), ADD CONSTRAINT `privilegiosfk` FOREIGN KEY (` userid`) REFERENCES `users` (` userid``); 

Als nächstes konsultieren wir die Datenbank, um zu sehen, ob die Daten gut sind

 SELECT users.name, levels.level VON Benutzern, Ebenen, Berechtigungen WO privilegios.idnivel = nivel.idnivel ANDusuarios.idusuario = privilegios.idusuario 

panta03.png

Nachfolgend sehen wir, wie es funktioniert. Wir versuchen, die Berechtigungen für einen Benutzer und eine Ebene einzufügen, die nicht existieren.
Der Satz besteht aus den folgenden INSERT INTO-Berechtigungen: VALUES (ID-Berechtigung, Benutzer-ID, Leerlauf); deshalb

 INSERT INTO privileges VALUES (6, 8, 10); 

panta04.png

Dies führt zu einem Fehler, da der Fremdschlüssel des Benutzers in den Tabellenberechtigungen zu einer Inkonsistenz führen würde, wenn wir einen Benutzer hinzufügen, der nicht in der Benutzertabelle vorhanden ist. Hier vermeiden wir den Fehler, bei dem Format MySam wären die Daten ohne Probleme gespeichert worden.

See also  WPHardening: Überprüfen Sie Schwachstellen und Sicherheitsprüfungen in Wordpress Web

Als nächstes werden wir versuchen, einen Benutzer aus der Benutzertabelle zu löschen:

 DELETE FROM `users` WHERE userid = 3 

Wenn Sie die SQL-Anweisung ausführen, erhalten Sie eine Fehlermeldung, da der Client nicht gelöscht werden kann, da er Daten in anderen Tabellen enthält. In diesem Fall befindet sich der Client mit der ID 3 in der Privilegientabelle. Wenn Sie ihn löschen möchten, müssen Sie ihn zuerst aus allen Tabellen und entfernen nach dem Client-Tisch.

panta05.png

Um diese Art von Datensätzen mit Fremdschlüsseln zu entfernen , verwenden wir den in CASCADA als Entfernen bezeichneten Datensatz , bei dem alle Datensätze, die sich auf eine bestimmte Abfrage beziehen, in allen Tabellen gelöscht werden, in denen sie Fremdschlüsselbeziehungen haben. Um diese Transaktion durchzuführen, verwenden wir die Funktion ON DELETE CASCADE .

Die erste Möglichkeit besteht darin, die Berechtigung zur Kaskadeneliminierung zu erteilen. Beachten Sie , dass beim Start standardmäßig der Verweistyp RESTRICT verwendet wird , der angibt, dass die Daten dieses Felds der Tabelle nicht aktualisiert oder gelöscht werden können Sie können jede Transaktion durchführen, daher ändern wir die Änderungs- und Entfernungsberechtigungen.

 ALTER TABLE "Privilegien" ADD CONSTRAINT `privilegiosfk` FOREIGN KEY (` userid``) Verweise `Benutzer` (` Benutzer-ID`) ON DELETE CASCADE ON UPDATE CASCADE; 

Wir führen die SQL-Abfrage erneut durch

 DELETE FROM `users` WHERE userid = 3 

Anschließend können wir die SQL-Abfrage ausführen, um sicherzustellen, dass sie nicht mehr in einer Tabelle enthalten ist:

 SELECT users.name, levels.level VON Benutzern, Ebenen, Berechtigungen WO privilegios.idnivel = nivel.idnivel AND users.user = privileges.user 

panta06.png

Benutzer 3 wurde aus der Benutzertabelle und auch aus der Privilegientabelle entfernt, da der Benutzer dort einen Fremdschlüssel hatte.

Dies gilt auch für das Update beim Ändern. Es kann kaskadiert werden, um die referenzielle Integrität in MySQL und die Beziehung zwischen Tabellen zu erhalten.

See also  Mache Skizzen in Gimp

Mal sehen, was passiert, wenn wir falsche Daten in die Kette einfügen, zum Beispiel einen Benutzer hinzufügen, aber wenn wir Privilegien hinzufügen, werden wir mit id verwechselt

 INSERT INTO VALUES-Benutzer (5, 'Julia Mountain'); INSERT INTO-Berechtigungen ("idprivilegio", "idnivel", "userid") VALUES (6, 2, 6); 

In diesem Fall wird der Benutzer gespeichert, jedoch nicht seine Berechtigungen, da die ID 6 nicht in der Benutzertabelle vorhanden ist.

administrator

Leave a Reply

Your email address will not be published. Required fields are marked *