[[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)