A tranzakciók alatt utasítást vagy utasítások sorozatát értjük, melyet egy felhasználó vagy alkalmazás hajt végre az adatbázis tartalmának olvasása vagy frissítése érdekében.
Például tranzakciónak tekinthető ha két bankszámla között egyenleg átutalás történik.
Vegyük példának Karlos és Ray felhasználókat. Karlos 5000 Ft-ot utal Ray-nek.
Ez a folyamat számos alacsony szintű folyamatot foglal magába. Egy ilyen tranzakció a következő lépéseket foglalja magába:
Open_Acc (Karlos)
OldBal = Karlos.bal
NewBal = OldBal - 5000
Karlos.bal = NewBal
CloseAccount(Karlos)
OpenAccount(Ray)
Old_Bal = Ray.bal
NewBal = OldBal + 5000
Ray.bal = NewBal
CloseAccount(Ray)
A gyakorlatban több SQL lekérdezést összefogunk egy csoportba és végrehajtjuk őket, mint egy tranzakció részét.
Fontos, hogy ezeket a tranzakciókat megfelelően kezeljük az adatintegritás biztosítása és az adatbáziskezelői hibák kezelése végett.
Tranzakciók tulajdonságai (angolul: ACID properties): Olyan tulajdonságok, amelyeket minden tranzakciónak követnie kell (ezeknek a végrehajtásáért különböző al-rendszerek felelősek).
Az izoláció határozza meg, hogy a tranzakció integritás hogyan látható más felhasználók és rendszerek által. Más szavakkal, a tranzakció a rendszerben úgy kell, hogy megjelenjen, hogy az az egyetlen tranzakció, amely hozzáfér az adatbázis rendszer erőforrásaihoz.
Az izolációs szintek határozzák meg annak a mértékét, hogy mely tranzakciókat kell elszigetelni a más tranzakciók által végzett adatmódosításoktól. Az izolációs szinteket a következő jelenségek határozzák meg:
Ezen jelenségek alapján az SQL 4 izolációs szintet határoz meg:
A választott izolációs szint függ az alkalmazás igényeitől. Magasabb szintek erősebb adatkonzisztenciát biztosítanak, de hosszabb zárolási időket eredményezhet, ami csökkenti a párhuzamosságot és a teljesítményt. Az alacsonyabb szintek több párhuzamosságot tesznek lehetővé az adatkonzisztencia csökkenése mellett.
Ezek mellett a szintek mellett egyes adatbáziskezelő rendszerek további szinteket is támogathatnak.
Az izolációs szintek előnyei:
Az izolációs szintek hátrányai:
INSERT
, UPDATE
és DELETE
.COMMIT
− A tranzakció által végrehajtott változtatások mentése. Minden tranzakciót ment, amely az adatbázison végrehajtásra került a legutóbbi COMMIT
vagy ROLLBACK
parancs óta.
COMMIT;
--Példa
--Tábla létrehozása a példa számára
CREATE TABLE customers (
id INT NOT NULL,
name VARCHAR (20) NOT NULL,
age INT NOT NULL,
address CHAR (25),
salary DECIMAL (18, 2),
PRIMARY KEY (id)
);
--Tábla feltöltése adatokkal
INSERT INTO customers VALUES
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00),
(2, 'Khilan', 25, 'Delhi', 1500.00),
(3, 'Kaushik', 23, 'Kota', 2000.00),
(4, 'Chaitali', 25, 'Mumbai', 6500.00),
(5, 'Hardik', 27, 'Bhopal', 8500.00),
(6, 'Komal', 22, 'Hyderabad', 4500.00),
(7, 'Muffy', 24, 'Indore', 10000.00);
--A 25 éves vásárlók törlése az adattáblából.
DELETE FROM customers WHERE age = 25;
--A változások mentése.
COMMIT;
COMMIT
parancsot, mert az autocommit
rendszerváltozó engedélyezve van. Ezért minden adatmódosító lekérdezés a változtatásokat egyből végre is hajtja.COMMIT
parancs használata, a MySQL a START TRANSACTION
parancsot alkalmazza.ROLLBACK
− A még nem mentett (COMMIT
-elt) változtatások visszavonása. Csak azokat a változtatásokat tudja visszavonni, amelyek a legutóbbi COMMIT
vagy ROLLBACK
óta történtek.
ROLLBACK;
--Példa
--A 25 éves vásárlók törlése az adattáblából.
DELETE FROM customers WHERE age = 25;
A változtatások visszavonása.
ROLLBACK;
SAVEPOINT
− Mentési pontokat hoz létre a tranzakción belül a ROLLBACK
parancs számára.
Alapesetben egy ROLLBACK
parancs a legutóbbi COMMIT
-ig vonja vissza a változtatásokat. Azonban lehetőségünk van mentési pontok létrehozására, hogy csak részben vonjuk vissza a tranzakció módosításait.
Két COMMIT
között több mentési pontot is megadhatunk.
Mentési pont létrehozása:
SAVEPOINT savepoint_name;
Mentési pont visszaállítása:
ROLLBACK TO savepoint_name;
--Példa
--Törlünk 3 vásárlót, de minden törlés előtt létrehozunk egy mentési pontot.
SAVEPOINT sp1;
DELETE FROM customers WHERE id=1;
SAVEPOINT sp2;
DELETE FROM customers WHERE id=2;
SAVEPOINT sp3;
DELETE FROM customers WHERE id=3;
--Egy mentési pont visszaállítása
ROLLBACK TO sp2;
Mentési pont törlése:
RELEASE SAVEPOINT savepoint_name;
SET TRANSACTION
− Egy tranzakció inicialzálása. Ezzel a paranccsal tudjuk meghatározni a tranzakció tulajdonságait (például az izolációs szintet vagy a hozzáférés módját).
REPEATABLE READ
.READ ONLY
) vagy írás olvasás (READ WRITE
). Alapértelmezetten READ WRITE
módot használ.GLOBAL
) vagy munkamenet szinten is (SESSION
).
GLOBAL
esetén a megadott tulajdonságok minden munkamenetre érvényesek lesznek.SESSION
kulcsszó esetén a tulajdonságok csak a jelenlegi munkamenetben végrehajtásra kerülő tranzakciókra lesznek érvényesek.SET [GLOBAL | SESSION] TRANSACTION
{ ISOLATION LEVEL level | access_mode};
--Példa
--Létrehozunk egy táblát az alábbi utasítással
CREATE TABLE employee(
first_name VARCHAR(20),
last_name VARCHAR(20),
age INT,
income INT
);
--Tranzakció indítása, beállítása, majd adatok betöltése CSV és XML fájlokból
START TRANSACTION;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
LOAD DATA INFILE 'C:/uploads/data.csv' into table employee
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\\n';
SAVEPOINT mysavepoint;
load xml infile 'C:/uploads/data.xml' into table employee ROWS IDENTIFIED BY '<row>';
START TRANSACTION
- Tranzakció indítása.
INSERT
, DELETE
vagy UPDATE
addig nem fog tényleges változtatást végrehajtani az adatbázison, amíg egy explicit COMMIT
vagy ROLLBACK
parancs nem kerül kiadásra.BEGIN
parancs.START TRANSACTION;
--Adatmódosító parancsok
COMMIT;
START TRANSACTION [transaction_property [, transaction_property] ...] | BEGIN [WORK]
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
SET autocommit = {0 | 1}
/*transaction_property:
WITH CONSISTENT SNAPSHOT
| READ WRITE
| READ ONLY*/
AND CHAIN
kulcsszavak egy új tranzakciót indítanak, amint a jelenlegi véget ér ugyanazzal az izolációs szinttel, mint a befejezett tranzakció.RELEASE
kulcsszó hatására a szerver bontja a kapcsolatot a klienssel a tranzakció végrehajtása után.NO
kulcsszó felülírja a CHAIN
és RELEASE
parancsok végrehajtását. Így biztosítani tudjuk, hogy azok más beállítás hatására se kerüljenek végrehajtásra.WITH CONSISTENT SNAPSHOT
tulajdonság egy folytonos olvasási folyamatot indít el az adatbázis tároló motor felé (pl.: InnoDB). Megegyezik azzal, mintha a tranzakció létrehozását egy SELECT
utasítás követné.SET autocommit
beállítás letiltja vagy engedélyezi az alapértelmezett automatikus COMMIT
-olást a jelenlegi munkamenetben.