[[oktatas:adatbazis-kezeles:mariadb:sql|< SQL]] ====== Tranzakció ====== * **Szerző:** Sallai András * Copyright (c) 2019, Sallai András * Szerkesztve: 2019, 2021 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== A tranzakcióról ===== Sokszor szeretnénk, ha bizonyos SQL utasítások együtt hajtódnának végre. Ha egyik SQL utasítás végrehajtása sikertelen, akkor a többi se hajtódjon végre. ===== Indítás ===== START TRANSACTION ===== Véglegesítés ===== COMMIT ===== Visszavonás ===== A ROLLBACK utasítás a tranzakciót megszakítja, teljesen visszavonja. rollback ===== SAVEPOINT ===== A SAVEPOINT egy résztranzakciót határoz meg. A visszavonás ehhez a ponthoz igazítható. SAVEPOINT A SAVEPOINT után meg kell adni egy tetszőlegesen választott nevet. A ROLLBACK utasítást, ezek után paraméterezve használjuk. Az így paraméterezett ROLLBACK utasítás nem zárja le a tranzakciót. A SAVEPOINT előtti részek véglegesítéséhez szükséges egy COMMIT; utasítást. SAVEPOINT azonosító ROLLBACK TO [SAVEPOINT] azonosító RELEASE SAVEPOINT azonosító ===== Példa ===== create table dolgozok( id int not null primary key auto_increment, nev varchar(50), telepules varchar(50), fizetes double ); create table naplo ( id int not null primary key auto_increment, osszes double ); insert into dolgozok (nev, telepules, fizetes) values ('Baja Géza', 'Szeged', 2850000), ('Fábi Ferenc', 'Szolnok', 2150000), ('Tenkes Emese', 'Szeged', 1850000), ('Lapos Bálint', 'Szolnok', 1755000), ('Lapi Mihály', 'Miskolc', 2100000 ); start transaction; select @a:=sum(fizetes) from dolgozok; insert into naplo (osszes) values (@a); commit; ===== Tábla zárolása ===== Táblát a LOCK TABLES utasítással zárolhatunk. Olvasási zárolás: lock table dolgozok READ A táblázat olvasható, nem írható. Folyamatok megtekintése: show processlist; Zárolás oldása: unlock table Vagy: unlock tables Ha zárolva van egy tábla, és zárolok egy másik táblát, az előző zárolás feloldódik. | read | read lock; olvasás engedélyezett, módosítás nem | | write | write lock; \\ más folyamat se írni, se olvasni | MyISAM motor esetén más lehetőségek is vannak, lásd: * https://mariadb.com/kb/en/lock-tables/ Táblamotor lekérdezése: show table status \G ===== Gyakorlat ===== A gyakorlathoz készítsünk egy adatbázist: create database pari; use pari; create table dolgozok ( az int not null primary key auto_increment, nev varchar(20), fizetes double ); insert into dolgozok (nev, fizetes) values ('Béla', 5000), ('Tibi', 5000); ==== Savepont gyakorlat ==== start transaction; update dolgozok set nev="Vali" where az=1; savepoint one; update dolgozok set nev="Béla" where az=2; rollback to one; commit; A Vali változtatás megmarad, a Béla nem. Végül le kell zárni a tranzakciót. ==== Zárolás gyakorlat ==== Zároljuk a táblát: lock table dolgozok read; Próbáljunk meg lekérdezni, változtatni, beszúrni és törölni egy másik terminálból: select * from dolgozok; update dolgozok set nev="Imre" where az=1; insert into dolgozok (nev, fizetes) values ('Lajos', 4000); delete from dolgozok where id=2; Az olvasás működik, az módosítások várnak a lock végére. Szüntessük meg a zárolást: unlock tables; ===== Forrás ===== * https://mariadb.com/kb/en/transactions/ (2020)