MySQL Извършва ACID транзакции и референтна цялост

Всяко приложение, което включва база данни, трябва да отговаря на характеристиките на ACID, в приложенията и професионалните мениджъри на бази данни концепцията ACID се отнася до характеристиките или свойствата, които гарантират, че транзакциите в базите данни се извършват безопасно и конфигурируеми. По -специално ACID означава атомност, последователност, изолация и издръжливост.

Транзакция в база данни например е вмъкване на запис или, ако го разглеждаме като бизнес модел, добавяне на нов клиент, промяна на продукт. Транзакциите винаги предизвикват промяна, вмъкване, промяна, изтриване, заявката не е транзакция, тъй като не произвежда промени.
Задаване на свойства на ACID

Атомност


Това свойство гарантира и проверява дали транзакцията е била извършена или не и това свойство показва, че ако дадена операция не се извърши завършена, тя се анулира, например да предположим, че вмъкваме запис и сървърът се срива, запис е записан в средата, тогава поради атомността този запис няма да бъде записан.
Друг пример, ако се извършва онлайн плащане и сумата се приспада от сметката ни, но плащането е неуспешно или системата се срива, тогава транзакцията се анулира и базата данни не я записва.

Последователност


Това е свойството, което гарантира, че транзакциите, които могат да завършат без проблеми, ще бъдат изпълнени. Тази концепция е свързана с целостта на базата данни. Той предотвратява промяната на данните и загуба на смисъл или без никаква справка, например клиент не може да бъде изтрит, докато е направил покупка в даден момент. Ако искате да изтриете клиента, първо трябва да изтриете всички фактури и данни, свързани с този клиент.

Изолация


Това е свойството, което гарантира, че ако две или повече транзакции се случат едновременно, те ще се изпълняват една след друга и ако се изпълняват паралелно, всяка ще направи това независимо една от друга, за да се избегнат възможни грешки.

Издръжливост


Имуществото е отговорно за гарантирането на извършената транзакция и промените, направени от транзакцията, са постоянни, дори в случай на проблем като липса на електричество или системни повреди.
MySQL поддържа формата InnoDB, който е форма за съхранение на данни за MySQL, включен като стандартен формат на таблица във всички MySQL дистрибуции. Този формат поддържа транзакции от тип ACID и референтна цялост.
Ще направим някои примери за внедряване на ACID с Mysql, след това заявките могат да бъдат реализирани на всеки език за програмиране. В тази база данни всеки потребител ще има ниво на привилегии и действия, които може да изпълнява в системата на компанията. Ще се съсредоточим само върху тази функционалност.
Ще започнем със създаването на база данни CompanyDB от phpmyadmin, тогава ще създадем потребителска таблица и ще изберем InnoDB механизъм за съхранение.

 - Структура на таблица за таблица `потребители` СЪЗДАВАЙТЕ ТАБЛИЦА, АКО НЕ СЪЩЕСТВАТ` потребители` (` userid` int (10) NOT NULL, `name` varchar (150) DEFAULT NULL) ENGINE = InnoDB AUTO_INCREMENT = 4 DEFAULT CHARSET = latin1;
Добавяме някои данни към таблицата на потребителите
 ВМЕСТВАНЕ НА „потребители“ („потребителски идентификатор“, „име“) СТОЙНОСТИ (1, „Карлос Алберте“), (2, „Пабло Калехос“), (3, „Ана Болена“);
В този случай ние създаваме първичния ключ на потребителската таблица, който ще бъде userid
 - Индекси на таблицата `users` ALTER TABLE` users` ДОБАВЯНЕ НА ОСНОВЕН КЛЮЧ (` userid`);
След това ще създадем таблицата с нива
 - Структура на таблицата за таблица `нива` CREATE TABLE IF NOT EXISTS` нива` (` levelid` int (11) NOT NULL, `level` varchar (50) DEFAULT NULL) ДВИГАТЕЛ = InnoDB AUTO_INCREMENT = 4 ПО -ДОБАВАНЕ CHARSET = latin1;
Добавяме някои данни към таблицата с нива
 ИНСЕРТИРАЙТЕ В `нива` (` levelid`, `level`) ЗНАЧЕНИЯ (1, 'Basic'), (2, 'Intermediate'), (3, 'Advanced');
След това създаваме таблицата с привилегии, където ще посочим нивото на разрешения на всеки потребител
 - Структура на таблицата за таблица „привилегии“ СЪЗДАВАЙТЕ ТАБЛИЦА, АКО НЕ СЪЩЕСТВАВАТ „привилегии“ („idprivilege“ int (11) NOT NULL, „idlevel“ int (11) NOT NULL DEFAULT '0', `idusuario` int (11) NOT NULL ) ДВИГАТЕЛ = InnoDB AUTO_INCREMENT = 4 КАРТЕТА ПО подразбиране = latin1;
Добавяме някои данни към таблицата с привилегии
 ВМЕСТВАНЕ НА `привилегии` (` privilegeid`, `levelid`,` userid`) СТОЙНОСТИ (1, 1, 1), (2, 2, 3), (3, 1, 2);
След това добавяме връзките от SQL редактора, аз присвоявам външен ключ, който свързва привилегиите и таблицата на потребителите чрез потребителски идентификатор и външния ключ, който свързва привилегиите с нива чрез идентификатор на ниво.
 - Филтри за таблицата `privileges` ALTER TABLE` privileges` ADD CONSTRAINT` levellfk` ВЪНШЕН КЛЮЧ (`levelid`) ЛИТЕРАТУРА` нива` (`levelid`), ДОБАВИ ОГРАНИЧЕНИЕ` privilegesfk` ЧУЖДЕН КЛЮЧ (` userid`) ПОТРЕБИТЕЛИ ` `(` userid`);
След това се консултираме с базата данни, за да видим дали данните са верни
 SELECT users.name, levels.level ОТ потребители, нива, привилегии WHERE privileges.idlevel = levels.levelid ANDusers.userid = privileges.userid

Нека видим как работи по -нататък, опитваме се да вмъкнем привилегиите на потребител и ниво, които не съществуват.
Изявлението ще бъде следното INSERT INTO privileges VALUES (privilegeid, userid, levelid); По този начин
 ВМЕСТВАНЕ НА ПРИВИЛИЦИОННИ СТОЙНОСТИ (6, 8,10);

Това дава грешка, тъй като външният ключ на userid в таблицата с привилегии би създал несъответствие, ако добавим потребител, който не съществува в таблицата на потребителите, тук избягваме грешката, с формата MySam данните щяха да бъдат записани без проблеми.
След това ще се опитаме да изтрием потребител от таблицата с потребители:
 ИЗТРИЙТЕ ОТ `потребители` КЪДЕ userid = 3
При изпълнението на SQL оператора той ще ни даде грешка, тъй като клиентът не може да бъде изтрит, защото има данни в други таблици, в този случай клиентът с идентификатор 3 е в таблицата с привилегии, ако искаме да го изтрием, първо трябва да го премахнем от всички таблици и след таблицата на клиента.

За да изтриете този тип записи с чужди ключове, се използва този, наречен delete ВОДОПАД, при което всички записи, свързани с конкретна заявка, ще бъдат изтрити във всички таблици, където имат връзки с външен ключ. За извършване на тази транзакция използваме функцията НА ИЗТРИВАНЕ НА КАСКАД.
Първото нещо ще бъде да се даде разрешение за изтриване в каскада, не забравяйте, че при стартиране по подразбиране референтният тип е ОГРАНИЧЕНИЕ което показва, че данните в това поле на таблицата не могат да бъдат актуализирани или изтрити, това е от съображения за сигурност, всяко изпълнено изречение няма да може да извърши никаква транзакция, затова променяме разрешенията за промяна и изтриване.
 ALTER TABLE `privileges` ADD CONSTRAINT` privilegesfk` FOREIGN KEY (` userid`) REFERENCES` users` (`userid`) ON DELETE CASCADE ON UPDATE CASCADE;
Изпълняваме отново SQL заявката
 ИЗТРИЙТЕ ОТ `потребители` КЪДЕ userid = 3
След това можем да извършим sql заявката, за да проверим дали вече не е в никоя таблица:
 SELECT users.name, levels.level ОТ потребители, нива, привилегиИ КЪДЕ privileges.idlevel = levels.idlevel И потребители.userid = privileges.userid

Потребител 3 е премахнат от таблицата на потребителите и от таблицата с привилегии, тъй като потребителският идентификатор има външен ключ там.
Това е същото за актуализациите при промяна, може да се каскадира, за да се поддържа референтната цялост в Mysql и връзката между таблиците.
Нека да видим какво ще се случи, ако добавим неправилни данни във вмъкването на веригата, например добавяме потребител, но когато добавим привилегия, получаваме грешен идентификатор
 ВМЕСТВАНЕ НА ПОТРЕБИТЕЛИТЕ на потребителите (5, „Julia Montaña“); INSERT INTO привилегии (`privilegeid`,` levelid`, `userid`) СТОЙНОСТИ (6, 2, 6);
В този случай потребителят ще бъде запазен, но не и привилегиите му, тъй като ID 6 не съществува в таблицата на потребителите.Хареса ли ви и помогнахте на този урок?Можете да възнаградите автора, като натиснете този бутон, за да му дадете положителна точка
wave wave wave wave wave