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)