MySQL veic skābes darījumus un atsauces integritāti

Jebkurai lietojumprogrammai, kas ietver datubāzi, jāatbilst ACID raksturlielumiem, lietojumprogrammās un profesionālos datu bāzes pārvaldniekos ACID jēdziens attiecas uz īpašībām vai īpašībām, kas garantē, ka darījumi datu bāzēs tiek veikti droši un uzticami. Konkrēti ACID apzīmē atomu, konsekvenci, izolāciju un izturību.

Darījums datu bāzē ir, piemēram, ieraksta ievietošana vai, ja mēs to uzskatām par biznesa modeli, Pievienot jaunu klientu, Modificēt produktu. Darījumi vienmēr rada izmaiņas, ievieto, modificē, dzēš, vaicājums nav darījums, jo tas nerada izmaiņas.
ACID rekvizītu norādīšana

Atomitāte


Tas ir īpašums, kas garantē un pārbauda, ​​vai darījums tika veikts vai nē, un šis īpašums norāda, ka, ja darbība netiek veikta pilnībā, tā tiek atcelta, piemēram, pieņemsim, ka mēs ievietojam ierakstu un serveris avarē, ieraksts tiek ierakstīts vidū, tad atomu dēļ šis ieraksts netiks ierakstīts.
Vēl viens piemērs, ja tiek veikts tiešsaistes maksājums un summa tiek atskaitīta no mūsu konta, bet maksājums neizdodas vai sistēma avarē, tad darījums tiek atcelts un datu bāze to neieraksta.

Konsekvence


Tas ir īpašums, kas garantē, ka tiks izpildīti darījumi, kurus var pabeigt bez problēmām. Šī koncepcija ir saistīta ar datu bāzes integritāti. Tas neļauj mainīt datus un zaudēt nozīmi vai būt bez atsauces, piemēram, klientu nevar izdzēst, kamēr viņš ir veicis pirkumu. Ja vēlaties dzēst klientu, vispirms ir jāizdzēš visi ar šo klientu saistītie rēķini un dati.

Izolācija


Tas ir īpašums, kas garantē, ka, ja divi vai vairāki darījumi notiek vienlaicīgi, tie tiks izpildīti viens pēc otra, un, ja tie tiek izpildīti paralēli, katrs to darīs neatkarīgi no otra, lai izvairītos no iespējamām kļūdām.

Izturība


Īpašums ir atbildīgs par darījuma garantēšanu, un darījuma veiktās izmaiņas ir neatgriezeniskas, pat ja rodas kāda problēma, piemēram, elektrības trūkums vai sistēmas kļūmes.
MySQL atbalsta InnoDB formātu, kas ir MySQL datu glabāšanas veids, kas iekļauts kā standarta tabulas formāts visos MySQL izplatījumos. Šis formāts atbalsta ACID tipa darījumus un atsauces integritāti.
Mēs veiksim dažus ACID ieviešanas piemērus ar Mysql, pēc tam vaicājumus varētu īstenot jebkurā programmēšanas valodā. Šajā datu bāzē katram lietotājam būs privilēģiju un darbību līmenis, ko viņi var veikt uzņēmuma sistēmā. Mēs koncentrēsimies tikai uz šo funkcionalitāti.
Sāksim ar datu bāzes izveidi UzņēmumsDB no phpmyadmin, tad mēs izveidosim lietotāju tabulu un atlasīsim InnoDB uzglabāšanas dzinēju.

 - Tabulas struktūra lietotājiem "CREATE TABLE IF NOT EXISTS" ("userid" int (10) NOT NULL, "name" varchar (150) DEFAULT NULL) ENGINE = InnoDB AUTO_INCREMENT = 4 DEFAULT CHARSET = latin1;
Mēs pievienojam dažus datus lietotāju tabulai
 INSERT INTO "users" ("userid", "name") VALUES (1, 'Carlos Alberte'), (2, 'Pablo Callejos'), (3, 'Ana Bolena');
Šajā gadījumā mēs izveidojam lietotāju tabulas primāro atslēgu, kas būs userid
 - tabulas indeksi "lietotāji" ALTER TABLE "lietotāji" PIEVIENOT PRIMĀRO ATSLĒGU ("userid");
Tālāk mēs izveidosim līmeņu tabulu
 - Tabulas struktūra līmeņiem "CREATE TABLE IF NOT NOTISTS" ("levelid" int (11) NOT NULL, "level" varchar (50) DEFAULT NULL) DZINĒJS = InnoDB AUTO_INCREMENT = 4 DEFAULT CHARSET = latin1;
Mēs pievienojam dažus datus līmeņu tabulai
 INSERT INTO "līmeņi" ("levelid", "level") VĒRTĪBAS (1, "Basic"), (2, "Intermediate"), (3, "Advanced");
Pēc tam mēs izveidojam privilēģiju tabulu, kurā mēs norādīsim katra lietotāja atļauju līmeni
 - Tabulas struktūra privilēģijām CREATE TABLE IF NOT EXISTTS ) DZINĒJS = InnoDB AUTO_INCREMENT = 4 DEFAULT CHARSET = latīņu1;
Mēs pievienojam dažus datus privilēģiju tabulai
 INSERT INTO "privilēģijas" ("privilegeid", "levelid", "userid") VĒRTĪBAS (1, 1, 1), (2, 2, 3), (3, 1, 2);
Pēc tam mēs pievienojam attiecības no SQL redaktora, es piešķiru svešu atslēgu, kas saistīs privilēģiju un lietotāju tabulu, izmantojot lietotāja ID, un ārējo atslēgu, kas saistīs privilēģijas ar līmeņiem līdz līmenim id.
 - Filtri tabulai "privilēģijas" ALTER TABLE "privilēģijas" PIEVIENOT KONSTRUKCIJU "levellfk" FOREIGN KEY ("levelid") REFERENCES "līmeņi" ("levelid"), ADD CONSTRAINT "privilegesfk" FOREIGN KEY ("userid") REFERENCES "lietotāji "(" lietotāja ID ");
Tālāk mēs apskatām datu bāzi, lai noskaidrotu, vai dati ir pareizi
 SELECT users.name, levels.level FROM lietotāji, līmeņi, privilēģijas WHERE privileges.idlevel = levels.levelid ANDusers.userid = privileges.userid

Redzēsim, kā tas darbojas tālāk, mēģinām ievietot privilēģijas lietotājam un līmenim, kas neeksistē.
Paziņojums būs šāds INSERT INTO privilēģijas VĒRTĪBAS (privilegeid, userid, levelid); Tādējādi
 INSERT INTO privilēģijas VĒRTĪBAS (6, 8,10);

Tas rada kļūdu, jo privilēģiju tabulā esošā userid svešā atslēga radītu nekonsekvenci, ja pievienotu lietotāju tabulā neeksistējošu lietotāju, šeit mēs izvairāmies no kļūdas ar formātu MySam dati būtu saglabāti bez problēmām.
Tālāk mēs mēģināsim izdzēst lietotāju no lietotāju tabulas:
 DELETE FROM `users` WHERE userid = 3
Izpildot SQL paziņojumu, tas mums parādīs kļūdu, jo klientu nevar izdzēst, jo tam ir dati citās tabulās, šajā gadījumā klients ar ID 3 atrodas privilēģiju tabulā, ja mēs vēlamies to izdzēst, tas vispirms ir jānoņem no visām tabulām un pēc klienta galda.

Lai dzēstu šāda veida ierakstus ar svešām atslēgām, tiek izmantots ieraksts ar nosaukumu dzēst ŪDENSKRITUMS, kurā visi ar konkrēto vaicājumu saistītie ieraksti tiks dzēsti visās tabulās, kurās tām ir ārējo atslēgu attiecības. Lai veiktu šo darījumu, mēs izmantojam funkciju IESLĒGT KASKĀDI.
Pirmā lieta būs atļaut dzēšanu kaskādē, atcerieties, ka, sākot ar noklusējumu, atsauces veids ir IEROBEŽOT kas norāda, ka datus šajā tabulas laukā nevar atjaunināt vai izdzēst, tas ir drošības apsvērumu dēļ, jebkurš izpildīts teikums nevarēs veikt nekādus darījumus, tāpēc mēs mainām modificēšanas un dzēšanas atļaujas.
 ALTER TABLE "privilēģijas" PIEVIENOT KONSTRUKCIJU "privilegesfk" FOREIGN KEY ("userid") REFERENCES "lietotāji" ("userid") IZSLĒGT KASKĀDI ATJAUNINĀT KASKĀDI;
Mēs vēlreiz veicam SQL vaicājumu
 DELETE FROM `users` WHERE userid = 3
Tad mēs varam veikt SQL vaicājumu, lai pārbaudītu, vai tas vairs nav nevienā tabulā:
 SELECT users.name, levels.level FROM lietotāji, līmeņi, privilēģijas WHERE privileges.idlevel = levels.idlevel UN users.userid = privileges.userid

Lietotājs 3 ir noņemts no lietotāju tabulas un arī no privilēģiju tabulas, jo lietotāja ID tur bija sveša atslēga.
Tas pats attiecas uz atjauninājumiem, veicot izmaiņas, to var kaskādēt, lai saglabātu atsauces integritāti Mysql un attiecības starp tabulām.
Paskatīsimies, kas notiks, ja ķēdes ieliktnī pievienosim nepareizus datus, piemēram, pievienosim lietotāju, bet, pievienojot privilēģijas, tiks iegūts nepareizs ID
 INSERT INTO users VALUES (5, 'Julia Montaña'); INSERT INTO privilēģijas (`privilegeid`,` levelid`, `userid`) VĒRTĪBAS (6, 2, 6);
Šajā gadījumā lietotājs tiks saglabāts, bet ne viņa privilēģijas, jo lietotāju tabulā nav 6. ID.Vai jums patika šī apmācība un palīdzējāt tai?Jūs varat apbalvot autoru, nospiežot šo pogu, lai sniegtu viņam pozitīvu punktu
wave wave wave wave wave