You are on page 1of 2

MySQL Transakcije podržava koristite show engines query koji će izlistati

podržane tipove tabela. Ako je potrebno omogućiti


neki od tipova tabela, konsultujte MySQL manual
Transakcija SQL rečnikom označava skup upita koji
kako da to učinite (ili kontaktirajte support ako je u
se izvršavaju kao celina. Ako su svi upiti uspešno
pitanju MySQL server na vašem hostingu). U našem
izvršeni onda je transakcija prošla, u suprotnom
primeru koristićemo se InnoDB tabelama, potpuno
vraćamo se u pređašnje stanje (rollback). Obzirom da
isto važi i za BDB tabele.
većina ljudi sam pojam transakcija vezuje za novac,
iskoristiću upravo jedan takav primer kako bi cela
Za početak kreirajmo jednu test tabelu:
stvar bila još jasnija.
create table test(
Zamislite transakciju gde Pera svom klijentu Mikici ime char(20) not null unique)
treba da isplati 1000 dinara za neku učinjenu uslugu. engine = innodb;
Evo kako bi tipičnim SQL rečnikom to mogli da
predstavimo: A sada da upotrebimo jednu transakciju:

update bank_accounts set amount = amount - mysql> start transaction;


1000 Query OK, 0 rows affected (0.00 sec)
where user = 'pera';
update bank_accounts set amount = amount + mysql> insert into test(ime)
1000 values('Pera');
where user = 'mikica'; Query OK, 1 row affected (0.01 sec)

mysql> insert into test(ime)


Šta ako se jedan od gornja dva upita ne izvrši values('Mikica');
korektno ? Imali bi situaciju da Pera ostane kratak za Query OK, 1 row affected (0.00 sec)
1000 dinara bez da je uplatio novac Mikici, ili da
Mikica dobije svoj novac od same banke u slučaju da mysql> commit;
prvi upit nije izvršen. Korišćenjem transakcija u Query OK, 0 rows affected (0.03 sec)
slučaju da dođe do greške sistem se vraća na stanje mysql> select * from test;
pre startovanja transakcije, tako da će u ovom +--------+
konkretnom slučaju biti izvršena oba upita ili nijedan | ime |
od njih. +--------+
| Mikica |
| Pera |
Transakcione baze tipično moraju obezbediti 4 +--------+
osobine koje se skraćeno nazivaju ACID: 2 rows in set (0.02 sec)
Atomicity
Iskaz se sastoji od nekoliko logičnih celina – skupa Kao što vidite, start transaction koristimo za početak
upita. Ili su svi upiti izvršeni uspešno ili nijedan od starta transakcije. Nakon uspešno izvršena 2 upita
njih. koristili smo commit za kraj transakcije, koja je u
Consistency ovom slučaju uspešno obavljena. Važna stvar je da
Baza je u koezistentnom stanju pre i posle transakcije. nijedna od promena tokom transakcije (recimo
Isolation unošenje novog imena Pera) nije vidljiva drugim
Transakcija nema efekat na druge procese. To znači klijentima sve dok se ne izvrši commit. To je osobina
da efekti pojedinačnih upita u transakciji nisu vidljivi Izolacije (I u ACID) koju smo pominjali ranije. A
drugim klijentima sve dok se transakcija uspešno ne sada da prikažemo jednu neuspelu transakciju:
izvrši (commit iskazom).
Durability mysql> select * from test;
Kada je transakcija uspešno obavljena njeni efekti su +--------+
| ime |
permanentni. +--------+
| Mikica |
A sada dosta teorije, vreme je da pređemo i na | Pera |
konkretnu upotrebu. Sintaksa koja sledi prilagođena je +--------+
MySQL-u 4.1.x. U zavisnosti od verzije vašeg 2 rows in set (0.02 sec)
MySQL servera biće potrebne izvesne izmene. Da bi mysql> start transaction;
ste saznali koju verziju servera koristitite u mysql Query OK, 0 rows affected (0.00 sec)
klijent programu ukucajte select version();.
Korišćenje transakcija moguće je samo sa InnoDB i mysql> insert into test(ime)
values('Laza');
BDB tabelama. Ako niste sigurni da li ih vaš server
Query OK, 1 row affected (0.00 sec) | ime |
+--------+
mysql> insert into test(ime) | Dragan |
values('Mikica'); | Laza |
ERROR 1062 (23000): Duplicate entry | Mikica |
'Mikica' for key 1 | Pera |
mysql> rollback; +--------+
Query OK, 0 rows affected (0.03 sec) 4 rows in set (0.00 sec)

mysql> select * from test;


+--------+
Kao što vidite, nakon unešenog prvog imena (Laza)
| ime | snimili smo poziciju u transakciji kao tacka1. Unos
+--------+ imena Mirko je poništen vraćanjem na tačku1, nakon
| Mikica | koje smo uneli uspešno ime Dragan i odradili commit.
| Pera | Na kraju transakcije, vidi se da ime Mirko nije uneto
+--------+
2 rows in set (0.00 sec) jer smo se vratili na tačku u transakciji gde to ime nije
postojalo.
U slučaju gore tokom transakcije došlo je do greške,
jer smo pokušali da unesemo već postojeću vrednost
(Mikica) u polje definisano kao jedinstveno (unique).
Kao rezultat došlo je do greške, pa smo izvršili
rollback iskaz. Kao što vidite tabela sadrži iste
slogove kao i pre početka transakcije, tj. ime Laza
koje je prvo uneto na početku transakcije nije ostalo
upisano jer transakcija u celini nije uspela.

Počev od verzije MySQL 4.1.1 moguće je snimiti


tačku u transakciji (savepoint) na koju se možemo
vratiti rollback k-dom. Evo primera:

mysql> select * from test;


+--------+
| ime |
+--------+
| Mikica |
| Pera |
+--------+
2 rows in set (0.00 sec)

mysql> start transaction;


Query OK, 0 rows affected (0.00 sec)

mysql> insert into test(ime)


values('Laza');
Query OK, 1 row affected (0.00 sec)

mysql> savepoint tacka1;


Query OK, 0 rows affected (0.00 sec)

mysql> insert into test(ime)


values('Mirko');
Query OK, 1 row affected (0.00 sec)

mysql> rollback to savepoint tacka1;


Query OK, 0 rows affected (0.00 sec)

mysql> insert into test(ime)


values('Dragan');
Query OK, 1 row affected (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.03 sec)

mysql> select * from test;


+--------+

You might also like