Transakce v databázi je například vložení záznamu nebo, pokud to vidíme jako obchodní model, přidání nového zákazníka, úprava produktu. Transakce vždy způsobí změnu, vložení, úpravu, odstranění, dotaz není transakcí, protože neprodukuje změny.
Specifikace vlastností ACID
Atomicita
Je to vlastnost, která zaručuje a ověřuje, zda byla transakce provedena nebo ne, a tato vlastnost naznačuje, že pokud není operace provedena kompletně, pak je zrušena, například předpokládejme, že vkládáme záznam a server havaruje, je zaznamenán uprostřed, pak kvůli atomičnosti nebude tento záznam zaznamenán.
Další příklad, pokud probíhá online platba a částka je odečtena z našeho účtu, ale platba se nezdaří nebo dojde k selhání systému, pak je transakce zrušena a databáze ji nezaznamená.
Konzistence
Je to vlastnost, která zaručuje, že budou provedeny transakce, které mohou být dokončeny bez problémů. Tento koncept má co do činění s integritou databáze. Zabraňuje tomu, aby se data změnila a ztratila smysl nebo byla bez jakéhokoli odkazu, například zákazníka nelze v určitém okamžiku smazat. Pokud chcete zákazníka odstranit, musíte nejprve odstranit všechny faktury a data související s tímto zákazníkem.
Izolace
Je to vlastnost, která zaručuje, že pokud dojde ke dvěma nebo více transakcím současně, budou provedeny jeden po druhém, a pokud jsou prováděny souběžně, každý to provede nezávisle na druhém, aby se předešlo možným chybám.
Trvanlivost
Je to majetek, který odpovídá za to, že transakce byla provedena a že změny provedené transakcí jsou trvalé, a to i v případě jakéhokoli problému, jako je nedostatek elektřiny nebo selhání systému.
MySQL podporuje formát InnoDB, což je forma ukládání dat pro MySQL, zahrnutý jako standardní formát tabulky ve všech distribucích MySQL. Tento formát podporuje transakce typu ACID a referenční integritu.
Uděláme několik příkladů implementace ACID s MySQL, dotazy by pak mohly být implementovány v jakémkoli programovacím jazyce. V této databázi bude mít každý uživatel úroveň oprávnění a akcí, které může provádět v systému společnosti. Zaměříme se pouze na tuto funkci.
Začneme vytvořením databáze SpolečnostDB z phpmyadmin, pak vytvoříme tabulku uživatelů a vybereme modul úložiště InnoDB.
- Struktura tabulky pro tabulku `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;Do tabulky uživatelů přidáme nějaká data
VLOŽTE DO HODNOTY `users` (` userid`, `name`) (1, 'Carlos Alberte'), (2, 'Pablo Callejos'), (3, 'Ana Bolena');V tomto případě vytvoříme primární klíč tabulky uživatelů, který bude ID uživatele
- Indexy tabulky `users` ALTER TABLE` users` ADD PRIMARY KEY (` userid`);Dále vytvoříme tabulku úrovní
- Struktura tabulky pro tabulky `úrovně` VYTVOŘIT TABULKU, NEBYLY EXISTOVAT` úrovně` (` levelid` int (11) NOT NULL, `level` varchar (50) DEFAULT NULL) ENGINE = InnoDB AUTO_INCREMENT = 4 DEFAULT CHARSET = latin1;Do tabulky úrovní přidáme nějaká data
VLOŽTE DO `úrovní` (` levelid`, `level`) HODNOTY (1, 'Basic'), (2, 'Intermediate'), (3, 'Advanced');Poté vytvoříme tabulku oprávnění, kde uvedeme úroveň oprávnění každého uživatele
- Struktura tabulky pro tabulku `privilegia` VYTVOŘIT TABULKU, NEBYLI EXISTUJÍ` oprávnění` (` idprivilege` int (11) NOT NULL, `idlevel` int (11) NOT NULL DEFAULT '0',` idusuario` int (11) NOT NULL ) MOTOR = InnoDB AUTO_INCREMENT = 4 VÝCHOZÍ CHARSET = latin1;Do tabulky oprávnění přidáme nějaká data
INSERT INTO `privileges` (` privilegeid`, `levelid`,` userid`) VALUES (1, 1, 1), (2, 2, 3), (3, 1, 2);Poté přidáme vztahy z editoru SQL, přiřadím cizí klíč, který spojuje oprávnění a tabulku uživatelů, pomocí ID uživatele a cizí klíč, který spojuje oprávnění s úrovněmi prostřednictvím ID úrovně.
- Filtry pro tabulku `privilegia` ALTER TABLE` privileges` ADD CONSTRAINT` levellfk` FOREIGN KEY (`levelid`) REFERENCES` levels` (`levelid`), ADD CONSTRAINT` privilegesfk` FOREIGN KEY (`userid`) REFERENCES` uživatelé `(` userid`);Dále zkontrolujeme databázi, abychom zjistili, zda jsou data správná
VYBRAT users.name, levels.level OD uživatelů, úrovně, privilegia WHERE privileges.idlevel = levels.levelid ANDusers.userid = privileges.useridPodívejme se, jak to funguje dále. Pokusíme se vložit oprávnění pro uživatele a úroveň, která neexistuje.
Prohlášení bude následující INSERT INTO privileges VALUES (privilegeid, userid, levelid); Tím pádem
VLOŽTE DO HODNOT privilegií (6, 8,10);To dává chybu, protože cizí klíč userid v tabulce oprávnění by vytvořil nekonzistenci, pokud přidáme uživatele, který v tabulce uživatelů neexistuje, zde se vyvarujeme chybám ve formátu MySam data by byla uložena bez problémů.
Dále se pokusíme odstranit uživatele z tabulky uživatelů:
ODSTRANIT OD `uživatelů` KDE userid = 3Při provádění příkazu SQL nám to zobrazí chybu, protože klienta nelze odstranit, protože má data v jiných tabulkách, v tomto případě je klient s ID 3 v tabulce oprávnění, pokud jej chceme odstranit, musíme jej nejprve odebrat ze všech tabulek a za tabulkou zákazníků.
K odstranění tohoto typu záznamů s cizími klíči se používá ten, který se nazývá odstranit VODOPÁD, ve kterém budou odstraněny všechny záznamy související s konkrétním dotazem ve všech tabulkách, kde mají vztahy s cizími klíči. K provedení této transakce používáme funkci NA VYMAZÁNÍ KASKÁDY.
První věcí bude udělit povolení kaskádově mazat, pamatujte, že při výchozím spuštění je typ odkazu OMEZIT což znamená, že data v tomto poli tabulky nelze aktualizovat ani odstranit, je to z bezpečnostních důvodů, protože jakákoli věta, která je provedena, nebude moci provést žádnou transakci, proto měníme oprávnění pro úpravy a mazání.
ALTER TABLE `privilegia` ADD CONSTRAINT` privilegesfk` FOREIGN KEY (` userid`) REFERENCES` users` (`userid`) ON DELETE CASCADE ON UPDATE CASCADE;Znovu provedeme dotaz SQL
ODSTRANIT OD `uživatelů` KDE userid = 3Potom můžeme provést sql dotaz, abychom ověřili, že už není v žádné tabulce:
VYBRAT users.name, levels.level OD uživatelů, úrovně, privilegia WHERE privileges.idlevel = levels.idlevel AND users.userid = privileges.useridUživatel 3 byl odebrán z tabulky uživatelů a také z tabulky oprávnění, protože ID uživatele tam mělo cizí klíč.
To je stejné pro aktualizace při úpravách, může být kaskádováno, aby byla zachována referenční integrita v MySQL a vztah mezi tabulkami.
Podívejme se, co se stane, když do řetězové vložky přidáme nesprávná data, například přidáme uživatele, ale když přidáme oprávnění, dostaneme nesprávné ID
VLOŽTE HODNOTY UŽIVATELŮ (5, „Julia Montaña“); INSERT INTO privileges (`privilegeid`,` levelid`, `userid`) VALUES (6, 2, 6);V tomto případě bude uživatel uložen, ale ne jeho oprávnění, protože ID 6 v tabulce uživatelů neexistuje.Líbil se vám tento návod a pomohl mu?Autora můžete odměnit stisknutím tohoto tlačítka, čímž mu dáte kladný bod