db2

PL/SQL (2)

Výhody

Nevýhody

PL/SQL blok

declare -- nepovinná deklarace lokálncích proměnných
begin -- povinné otevření bloku příkazů
exception -- nepovinné zachytávání vyjímek
end -- povinné ukončení bloku
|| -- operátor konkatenace (sjednocení řetězců)
v_lg Student.login%TYPE -- proměnná v_lg bude stejného typu co Student login 
%ROWTYPE -- strukturovaný datový typ

Vyjímky

Příklady vyjímek


Procedury (3)

Několik typů procedur: - Anonymní procedury - víceméně begin ... end; blok - Pojmenované procedury - Pojmenované funkce - vrací hodnotu, narozdíl od procedur

Trigger


Cykly (4)

Kurzory

Balíky

Bulk operace


Statické a dynamické SQL (5)

Dynamické SQL

Zpracovaní dotazu

SQL injection

Ochrana

Má smysl psát logiku aplikace v PL/SQL?


Transakce (6)

Zotavení databáze

Zotavení (recovery) => zotavení databáze z nějaké chyby (přetečení hodnoty atributu, pád systému)

Korektní vs Konzistentní stav?

Transakce

Klasifikace chyb

Potvrzovací bod (Commit point)

Vlastnost ACID

Implementační detaily

Zotavení systému

Základní techniky zotavení

deferred_update
immediate_update
combined_update

Po restartu DBS spustí tento algoritmus:

  1. Vytvoř 2 seznamy transakcí: UNDO a REDO
  2. Do UNDO vlož všechny transakce, které nebyly potvrzeny před posledním kontrolním bodem (REDO je prázdné)
  3. Začni procházet záznamy v logu od posledního kontrolního bodu
    1. Pokud je pro transakci T nalezen v logu záznam COMMIT, přesuň T z UNDO do REDO
  4. DBS prochází log zpětně a ruší aktualizace transakcí ze seznamu UNDO
  5. DBS prochází log dopředu a přepracovává aktualizace transakcí ze seznamu REDO
  6. Databáze je v korektním stavu eyyy /

Záchrané body (savepoints)

Transakce (idk)

Zotavení vs. Souběh

7 skipped


Řízení souběhu (8)

Problémy souběhu

Ztráta aktualizace (lost update)

Čas Transakce A Transakce B
t1 READ t
t2 READ t
t3 WRITE t
t4 WRITE t

Nepotvrzená závislost (uncommitted dependency)

Čas Transakce A Transakce B
t1 WRITE t
t2 READ t
t3 ROLLBACK

Nekonzistentní analýza (inconsistent analysis)

Čas Data Transakce A Transakce B
t1 acc1=30
acc2=20
acc3=50
READ acc1
suma=30
t2 acc1=30
acc2=20
acc3=50
READ acc2
suma=50
t3 acc1=30
acc2=20
acc3=60
WRITE acc3=60
t4 acc1=20
acc2=20
acc3=60
WRITE acc1=20
t5 acc1=20
acc2=20
acc3=60
COMMIT
t6 acc1=20
acc2=20
acc3=60
READ acc3
suma=110 ne 100

Konflikty čtení a zápisu

(R-Read, W-Write)

Techniky řízení souběhu

Typy zámků

Zamykací protokol (data access protocol, locking protocol)

  1. Transakce, která chce získat záznam z db musí nejprve požadovat Sdílený zámek (S)
  2. Transakce, která chce aktualizovat záznam v db musí nejprve požadovat Výlučný zámek (X), pokud tato transakce drží S, jej změněn na X
  3. Jestliže zámek požadovaný transakcí B nemůže být přidělen, B přejde do stavu čekání (wait state)
  4. Výlučné zámky jsou automaticky uvolněny na konci transakce, Sdílené zámky jsou také nejčastěji uvolněny na konci transakce

Řešení problémů ztráty aktualizace

Čas Transakce A Transakce B
t1 READ t
Získán zámek S na t
t2 READ t
Získán zámek S na t
t3 WRITE t
Požadavek na zámek X na t
t4 wait WRITE t
Požadavek na zámek X na t
t5 wait wait
t6 wait wait

Řešení problémů nepotvrzené závislosti

Čas Transakce A Transakce B
t1 WRITE t
Získán zámek X na t
t2 READ t
Požadavek na zámek S na t
t3 wait COMMIT/ROLLBACK
Uvolnění zámku X na t
t4 opakuj: READ t
Získán zámek S na t
Čas Transakce A Transakce B
t1 WRITE t
Získán zámek X na t
t2 WRITE t
Požadavek na zámek X na t
t3 wait COMMIT/ROLLBACK
Uvolnění zámku X na t
t4 opakuj: WRITE t
Získán zámek X na t

Řešení problému nekonzistentní analýzy

Řešení problému uváznutí

  1. Detekce uváznutí:
    1. Nastavení časových limitů
    2. Detekce cyklů v grafu Wait-for
  2. Prevence uváznutí pomocí časových razítek

Řešení uváznutí

  1. Každé transakci je předěleno časové razítko - čas začátek transakce - je unikátní

  2. Pokud transakce A požaduje zámek na záznam, který už je uzamčený transakcí B

    wait-die
    wound-wait
  3. Pokud je transakce spuštěna znovu, necháva si původní timestamp

(wait-die: A čeká, wound-wait: B je zabito.. vždycky je zabito mladší)


Sériový a serializovatelný plán (10)


  1. Ekvivalentní plány
  2. Serializovatelný plán

Věta o dvoufázovém uzamykání?

Transfer Processing Performace

Úroveň izolace

Úroveň izolace Špinavé čtení Neopakovatelné čtení Výskyt fantomů
READ UNCOMMITTED ano ano ano
READ COMMITTED ne ano ano
REPEATABLE READ ne ne ano
SERIALIZABLE ne ne ne

Neopakovatelné čtení

Čas Transakce A Transakce B
t1 SELECT t
t2 UPDATE t
t3 COMMIT
t4 SELECT t
t5 COMMIT

Výskyt fantomů

Čas Transakce A Transakce B
t1 SELECT <t0-t2>
t2 INSERT t
t3 COMMIT
t4 SELECT <t0-t2>
t5 COMMIT

Správa verzí

Granualita zámků


Fyzická implementace (11)

Cena operací plánu

Index

Rozshavhový dotaz v indexu

Složený klíč

ID zakázky ID produktu Cena
1 123 32
1 124 5454
1 321 217
2 123 3017
2 321 247

Minispecifikace

Název: Aktualizace uživatele

Popis: Aktualizuje uživatele v databázi, pokud tam není, tak ho vloží. Funkce bude řešena jako transakce.

Vstupy: #id_user - id uživatele #first_name - jméno uživatele #last_name - příjmení uživatele

Výstupy #message - výstupní zpráva (inicializováno na NULL)

  1. Do proměnné #user_count si uložíme, kolik uživatelů s daným id existuje sql select count(*) from User where id = #id_user

  2. Pokud #user_count = 1: 2.1. Aktualizujeme záznam o uživateli

     ```
     update User
     set
         first_name = #first_name,
         last_name = #last_name
     where user_id = #user_id
     ```

    2.2 Nastavíme hlášení #message na „Uživatel byl upraven.“.

  3. Pokud #user_count = 1: 3.1. Vložíme záznam o uživateli

     ```
     insert into User (first_name, last_name)
     values (#first_name, #last_name)
     ```

    3.2 Nastavíme hlášení #message na „Uživatel byl přidán.“.

  4. Transakci ukončíme.