Tartalomjegyzék

< SQL

Tranzakció

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:

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