von Kiss Máté Vor 7 Jahren
336
Mehr dazu
Forrás: Előadás diáik
A tranzakció SQL műveletek (DML műveletek) egy olyan sorozata, amely vagy teljes egészében érvényre jut, vagy annak minden módosítása visszavonásra kerül.
A tranzakciókkal logikai csoportokba rendezzük a módosításainkat.
A fejlesztő (programozó) felelőssége, hogy pontosan a megfelelő egységekbe (tranzakciókba) csoportosítsa a DML műveleteket.
Egyes adatbáziskezelőknél a tranzakció során elhelyezhetőek olyan pontok, amelyekre opcionálisan vissza lehet térni, ez a potenciális visszatérési pont a SAVEPOINT.
Ezekre a visszatérési pontokra a ROLLBACK TO SAVEPOINT utasítással térhetünk vissza.
Példa:
UPDATE...
SAVEPOINT update_done;
Savepoint created
INSERT...
ROLLBACK TO update_done;
Rollback complete
Ha egy tranzakciót véglegesíteni akarunk, azt a COMMIT utasítással tesszük.
Ha viszont menet közben meggondoltuk magunkat, és vissza akarjuk vonni az éppen folyamatban lévő tranzakciónkat, azt a ROLLBACK utasítással tesszük.
Példa:
SELECT COUNT(*) FROM newworker;
COUNT(*)
----------
53
INSERT INTO newworker SELECT * FROM newworker;
53 rows inserted
SELECT COUNT(*) FROM newworker;
COUNT(*)
----------
106
DELETE FROM newworker WHERE position_id LIKE 'SALES%';
28 rows deleted
SELECT COUNT(*) FROM newworker;
COUNT(*)
----------
78
ROLLBACK;
rollback complete
SELECT COUNT(*) FROM newworker;
COUNT(*)
----------
53
Two phase commit
Példa:
DELETE FROM copy_emp;
22 rows deleted
ROLLBACK ;
Rollback complete
Az adatbáziskezelők azon funkcióit, melyek a többfelhasználós környezetben biztosítják minden felhasználó számára a konzisztens adatbázis képet az ACID rövidítéssel jellemzik (Atomicity, Cosistency, Isolation, Durability - Atomikusság, Konzisztencia, Elszigeteltség, Állandóság).
Konzisztencia (Consistency):
A tranzakció befejezése után az adatbázisnak konzisztens állapotba kell kerülnie.
Elszigeteltség (Isolation):
A párhuzamosan futó tranzakcióknak egymástól függetlenül kell működniük. Minden felhasználónak úgy kell tünnie mintha csak ő használná az adatbázist. Hatékonysági okokból nem lehet a függetlenséget úgy biztosítani, hogy egyidőben csak egy tranzakció futhat az adatbázison. Helyette sor illetve tábla zárolásokat alkalmaznak az adatbáziskezelők.
Atomikusság (Atomicity):
A tranzakcióba bevont DML utasításokat egy egységként kell kezelnie az adatbáziskezelőnek, például, ha a tranzakció végrehajtása valamilyen hardver, szoftver hiba miatt megszakad, akkor az adatbáziskezelőnek automatikusan vissza kell vonnia az addig végrahatott műveleteket, hogy a tranzakció kezdése előtti konzisztens állapot álljon elő.
Állandóság (Durability):
A lezárt tranzakciók eredménye nem veszhet el. Hatékonysági okokból az adatbáziskezelők nem írják rögtön diszkre a módosított adatokat, hanem memóriában tárolják. Például egy hardver hiba a memória tartalma és így a tranzakció eredményének elvesztésével járhatna. Az ilyen adatvesztéseket az adatbáziskezelők tranzakció log használatával oldják meg.
A DML utasítások a meglévő táblák (általánosabban "egyes séma-objektumok") adatait módosítják.
DML utasítás lehet, ha:
A DML utasítások sorozatát tranzakciónak nevezzük, amely az adatmódosításaink egy logikai egysége. Ezeket a módosításokat egységenként vagy érvényesítjük a végén, vagy mindenestül visszavonjuk.
A táblák meglévő sorainak törlése.
Példa:
DELETE [FROM] table
[WHERE condition];
Példa:
DELETE FROM divisions
WHERE division_name = 'Contracting';
1 row deleted
Példa:
DELETE FROM divisions
WHERE division_name = 'Recruiting';
Egy DELETE segítségével törölhetők ki olyan sorok is, amelyek megtalálhatóak egy másik táblában, vagy akár fordítva, azok, amelyek nem találhatóak a másikban sem.
Példa:
DELETE FROM newworker
WHERE worker_id NOT IN
(SELECT NVL(manager_id,-1)
FROM workers);
39 row deleted
Sorok beszúrása a táblába. Az INSERT utasítással sorokat adunk hozzá a táblához, a nézet alaptáblájához, vagy esetleg egyéb nem szabványos elemhez.
Példa:
INSERT INTO table [(column [, column...])]
VALUES (value [, value...]);
Ezzel a szintaxissal egy utasítással csupán egy sort szúrhatunk be.
Megadjuk az oszlopokat, amelyek értéket kapnak:
Példa:
INSERT INTO divisions (division_id,division_name,
manager_id,city,country_id,parent_id)
VALUES (2,'Headquarters',
100,'San Francisco','US',NULL);
1 rows inserted
Implicit módszer: azokat az oszlopokat kihagyjuk az oszloplistából, amelyekbe NULL kell, hogy kerüljön:
Példa:
INSERT INTO divisions
(division_id,division_name,manager_id,city) VALUES (2,'Headquarters',100,'San Francisco');
1 row created
Explicit módszer: NULL kulcsszót használunk a VALUES klauzulában:
Példa:
INSERT INTO divisions
VALUES (100, 'Finance', NULL, NULL, NULL, NULL);
1 row created
Írhatunk INSERT utasítást egy allekérdezéssel:
Példa:
INSERT INTO preferred_customers
SELECT * FROM customers
WHERE credit_rating in ('GOOD','EXCELLENT');
105 row created
Ilyenkor nem szerepel a VALUES klauzula.
Az INSERT klauzula oszlopainak a száma megegyezik az allekérdezés oszlopainak a számával:
Példa:
INSERT INTO preferred_customers
(customer_id ,customer_name,city)
SELECT customer_id ,customer_name,city FROM customers
WHERE credit_rating in ('GOOD','EXCELLENT');
105 row created
A meglévő sorok értékeinek a módosítása.
Az UPDATE utasítás a tábla soraiban, vagy a nézet alaptáblája, esetleg egy materializált nézet soraiban lévő attribútumok értékeit módosítja:
Példa:
UPDATE table
SET column = value [, column = value, ...]
[WHERE condition];
Példa:
UPDATE workers
SET division_id = 70
WHERE worker_id = 100;
1 row updated
Példa:
UPDATE workers
SET last_name = UPPER(last_name);
53 rows updated
Egyszerre tetszőleges számú sor is módosítható allekérdezéssel:
Példa:
UPDATE workers
SET (position_id, salary) = (SELECT position_id, salary
FROM workers WHERE worker_id = 205)
WHERE worker_id = 206;
1 rows updated
A korrelált allekérdezés egy olyan SELECT utasítás, amely be van ágyazva a másik utasításba (itt pl. az UPDATE-be), és amely hivatkozik az őt körülvevő SQL utasítás oszlopára vagy oszlopaira.
Amikor elképzeljük a működését, akkor úgy képzeljük, hogy a külső UPDATE utasítás által érintett minden sorra külön lefut a belső SELECT.
Példa:
UPDATE customers c
SET comments = (SELECT TO_CHAR(SUM(total_amount))
FROM orders o
WHERE o.customer_id = c.customer_id);
135 rows updated
A példában a CUSTOMERS tábla COMMENTS mezőjébe írtuk be azt, hogy az illető ügyfél összesen mekkora értékben rendelt terméket.