< SQL

Tranzakció

Szerző: Sallai András

Copyright © Sallai András, 2019, 2021

Licenc: GNU Free Documentation License 1.3

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)