
### Modely a vlastnosti transakcí ###

{{multiple image

|align = tright
|direction = horizontal

| image1 = Transakce.png

| width1 = 416
| caption1 = **Transakce** notace podle Graye

| image2 = Flat.png

| width2 = 400
| caption2 = **Flat model**(př.3 stavy): transakce T je aktivní (a bude ABORTovat), T je ABORTovaná, T je COMMITovaná

}}
Transakce je posloupnost akci (r, w, vypocet,..) nad persistentními daty se kterou se zachazi jako s celkem. 

Zacatek transakce se oznacuje obvykle BEGIN, konec COMMIT/ABORT,ROLLBACK. V pripade neuspesneho zakonceni transakce se system vrati do stavu pred zapocetim te transakce.

Databázové transakce musí splňovat tzv. vlastnosti ACID (*viz \[\[wen*
:: ACID]]*):*

:**A**tomicity - Transakce proběhne celá, nebo vůbec.
:**C**onsistency - Při provádění transakcí se DB převádí z jednoho konzistentního stavu do jiného.

:**I**solation - Transakce o sobe navzájem nevědí, jako by běžela jen jedna.
:**D**urability - Změny commitnuté transakce jsou trvalé.

#### Flat Model (FM) ####

Omezení transakčního modelu flat transactions, která mohou bránit jeho praktickému využití v některých transakčních systémech:

*Mají příliš velký rozsah. Abortu po stotisící operaci se nedá nijak zabránit. To se dá přičíst tomu, že nemají žádnou vnitřní strukturu.
*Žádný dílčí neúspěch není tolerován. Pokud je špatně jediné číslo konta u deseti tisíc zaměstnanců nějakého podniku, pak transakce odeslání mezd všem zaměstnancům kvůli této chybě abortuje.

*Flat transakce nemohou spolupracovat s jinými transakcemi. Nemohou s nimi sdílet data (pro sdílení dat neexistují žádná primitiva nebo pravidla), nemohou být vzájemně propojeny přes signifikantní události.
*Neřeší přirozený problém vnoření do sebe. Běžné programovací jazyky umožňují vnořovat volání procedur, take se může stát, že zavoláme v transakci proceduru, která zahájí novou vnořenou transakci.

{{multiple image

|align = tright
|direction = horizontal

| image1 = Sp.png

| width1 = 357
| caption1 = **SavePointy**

| image2 = CT.png

| width2 = 420
| caption2 = **Zřetězené transakce**

}}

#### Savepointy (SP) ####

*podporuje MS SQL Server 2008 a Oracle také commitovány.
*rollbacky se neprovadi az na zacatek, ale k jiz ulozenym savepointum (první SP většinou po startu transakce).

*dopředný rollback
**rollback k rollbacknutým stavům

**rollbacky se pak stávají součástí historie
*neřeší tvrdé výpadky systemu ⇒ po opetovnem nabehnuti systemu se musi transakce provest znovu, ne od posledniho savepointu, persistetní savepointy zase nemusí odpovídat stavu kódu transakce

{{collapse|Dopředný rollback detailně|
Dopředný rollback u SP si představuju jako akci zpět a dopředu u prohlížečů.

Akce zpět způsobí klasický rollback k danému SP (tj. v prohlížeči se vrátit o X stránek zpět).

Akce dopředu způsobí, že se zruší rollback a vrátíš se k původně smazanému SP (tj. v prohlížeči jít o X stránek dopředu).

V praxi si myslím, že to funguje následovně (předpoklad: těsně před zavolání rollbacku se vytvoří SP):

    SP1 ... SP2 ... SP3 ... SP4 ... SP5 + Rollback(SP2)                    ... SP6 ... Rollback(SP5)

Vyzvětlivky:
- Rollback(SP2) způsobí vytvoření SP5 a zrušení efektu akcí mezi SP2 a SP5;

- Rollback(SP5) funguje jako dopředný rollback - tj. smaže se efekt akcí mezi SP2 a SP6 a znovu se projeví efekt akcí mezi SP2 a SP5.

Ale tadyto jsem nikde nevyčetl, je to spíš moje představa o tom, jak by to mohlo fungovat.}}

#### Zřetězené transakce (Chained Transactions - CT) ####

*Programátor se po části výpočtu vzdá možnosti rollbacku nad touto částí, tj. komituje

*Nechce ale ztratit kontext, kurzory, atp.
*Tj. je potřeba zavést atomickou operaci *Chain work* = Commit + Begin

[Soubor:nt.png](Soubor:nt.png)

#### Hnízděné transakce (Nested Transactions - NT) ####

výpočet jako hierarchie transakcí, zobecnění SP

Pravidla pro podtransakce:

*COMMIT pravidlo - po potvrzení podtransakce jsou výsledky dostupné jen v rodičovské transakci, podtran. skutečně potvrdí až s potvrzením kořenové transakce
*ROLLBACK pravidlo - pokud je podtransakce zrušena, bere sebou všechny své potomky (i když už lokálně potvrdili), když je zrušena kořenová transakce

*pravidlo viditelnosti změn - zmeny v podtransakci jsou po lokálním COMMITu vidět jen v rodiči, objekty držené rodičem jsou přístupné potomkům, potomci jsou izolovaní v případě souběžného spuštění
*rodič rozhoduje o řešení zrušení potomka (restartovat, zvolit alternativní výpočet, abortovat)

ACID vlastnosti podtransakci jsou splnene jen částečně: A - podtr. jsou A jen z rodiče, C - podtr. jsou C vzhledem lok.fci., I - silná, D - neplatí kvuli commit pravidlu

#### Distribuované Transakce - DT (🎓) ####

| příklad DT - převod peněz|
|----|
| <small>

|

* 

* 
* 
* 

##### Zamykaní v DT - centralizované/decentralizované #####

|2PC|
|----|
|

|![wedding.png](wedding.png?do=get){: alt="wedding.png"}|

##### Dvoufázový Commit 2PC (two-phase commit) #####

1. 

1. 

* 

### Izolace transakcí, alokace prostředků. Uzamykací protokoly, časová razítka. (🎓🎓) ###

* 
* 

#### Rozvrhy (VSR ⊃ CSR a RC ⊃ ACA ⊃ ST) ####

#### Izolace transakcí ####

| Stupeň izolace / fenomén| **Řešení pomocí zámků**|**DIRTY READ (WR)**|**NON-REPEATABLE READ (RW)**|**PHANTOM    **|
|----|----|----|----|----|
|    **READ UNCOMMITTED** zabranuje přepsání nepotvrzených dat| nejsou nutné žádné zámky na čtení, S2PL na zápis|může nastat|může nastat|může nastat    |
|**READ COMMITTED** zabraňuje navíc čtení nepotvrzených dat| zámky na čtení (**shared**), S2PL na zápis|nemůže nastat|může nastat|může nastat    |
|**REPEATABLE READ** nestane se že 2 stejna cteni vrati ruzne hodnoty| S2PL|nemůže nastat|nemůže nastat|může nastat    |
|    **SERIALIZABLE** zabraňuje navíc fantomům| S2PL + prevence fantoma (**predikátové/intervalové/granulované zámky**)|nemůže nastat|nemůže nastat|nemůže nastat    |

* 
* 
* 

#### Zámky ####

* 
    * 
    * 
    * 

* 

* 

#### Uzamykací protokoly ####

|popis|konfliktová uspořadatelnost (CSR)|zotavitelnost rozvrhu (RC)|proti kask. abortům (ACA)|zabraňuje deadlocku|
|----|----|----|----|----|
|2PL|nejdrive T jenom zamyká, pak jenom odemyká|ANO|NE|NE|NE|
|S2PL|uvolňuje zámky až po konci T (COMMIT / ABORT)|ANO|ANO|ANO|NE|
|K2PL (SSPL)|uzamykání pouze na začátku T, odem. na konci|ANO|ANO|ANO|ANO|

:: 

:: 

:: 

* 
* 

##### Deadlock (uváznutí) #####

#### Časová razítka - Time Ordering (TO) ####

* 
* 

:: 

* 

:: 

* 
* 

#### Pomocí precedenčního grafu (PG) ####

#### Certifikace (optimistické řešení) ####

* 

#### Multiversion data ####

* 

:: 

### Zotavení z chyb, žurnály (🎓🎓) ###

* 
* 

#### ARIES (Algorithms for Recovery and Isolation Exploiting Semantics) ####

:: 

