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.
A ROLLBACK utasítás a tranzakciót megszakítja, teljesen visszavonja.
rollback
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ó
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á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:
Táblamotor lekérdezése:
show table status \G
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);
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á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;