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.
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.
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.
- 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
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);
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.
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.
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
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.
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.