Posted By: medved (A~z na v~eky Mikov~ce.) on 'CZdatabases'
Title:     Re: Transakce (Was: Update)
Date:      Tue Feb 29 14:07:06 2000


Trochyu tady jen opravim, jak je to s temi transakcemi...

Existuji v zasade dva transakcni mody - chained a unchained. Lisi se v tom, co 
je implicitne transakci.

U chained mode (defaultne Oracle, ANSI) zacina transakce prvnim provedenym 
prikazem a VZDY se musi ukoncit commitem (nebo rollbackem ci padem spojeni)

U unchained mode (Sybase, MS SQL) je kazdy prikaz samostatna transakce. Pokud 
chcete sdruzit vice prikazu do jedne transakce, musite ji explicitne 
odstartovat pomoci 'begin transaction' a ukoncit pomoci commitu nebo 
rollbacku.

Drtiva vetsina serveru podporujicich transakce umoznuje prepinat mezi temito 
mody, kazdopadne je ale dobre o nich vedet.

K transakcim se vaze tzv. isolation level - uroven odstineni jednotlivych 
uzivatelu od sebe. A to jsou prave ty TRANSACTION_ priznaky z JDBC. Znamenaji 
nasledujici:

Dirty Read (Read Uncommited) - moznost zteni tech radek, ktere nekdo zmenil, 
ale jeste necommitoval - Tady pozor Oracle vam vrati hodnotu pred cizim 
updatem, Sybase tu po cizim updatu (= Oracle si mysli, ze dojde k rollbacku 
[pesimista], Sybase se domniva, ze bude commit [optimista])

Nonrepeatable read - situace, kdy udelate select na zacatku vasi transakce a 
ten vam vrati zaznam se jemnem 'Pepa'. Pokracujete v transakci a mezi tim 
jiny uzivatel zmeni ve zminenem radku jmeno 'Pepa' na 'Franta' (a provede 
commit). Select ze zacatku transakce jiz nemuzete opakovat - vrati zmenena 
data. Pri zakazani nonrepeatable read se zamknou data uz pri prvnim select a 
jiny uzivatel nam je nemuze zmenit.

Phantom read - Provedete select, s podminkou ze datum narozeni j> 1.1.1960. 
Pokracujete v transakci a mezi tim nekdo prida cloveka s datem narozeni 
splnujicim podminku (1.1.1970) - pri opakovani vaseho selectu se najednou 
objevy 'phantom row', ktera tam na zacatku nebyla. Stejne tak by mohly nejake 
radkky zmizet (pri updatu data narozeni).

A ted k tem izolacnim urovnim - jsou 4 oznacene 0,1,2,3 a znamenaji:

Isolation level 0 - povoluje dirty read, nonrepeatable read a phantom read
tedy TRANSACTION_READ_UNCOMMITED

Isolation level 1 - zakazuje dirty read, povoluje nonrepeatable read a phantom 
read - tedy TRANSACTION_READ_COMMITTED

Isolation level 2 - zakazuje dirty read a nonrepeatable read, povoluje 
phantom read - tedy TRANSACTION_REPEATABLE_READ

Isolation level 3 - zakazuje dirty read, nonrepeatable read a phantom read - 
tedy TRANSACTION_SERIALIZABLE

K transakcim maji uzky vztah zamky a zamykani dat (tj. mechanismus, skrz 
ktery jsou zakazovany jednotlive druhy cteni [dirty read...]).

A u zamku muzeme mluvit o jejich 'granularite' - zda se zamkne jenom radka, 
databazova stranka nebo cela tabulka, zda zamykame pouze datove stranky, nebo 
i indexove stranky...

...a pomoci tehle veci si muze clovek pomerne dost pohrat s vykonem celeho db 
serveru... 

I 

> *** Transakci je nekolik druhu - alespon pres JDBC:
> TRANSACTION_NONE 
>           Transactions are not supported.
> TRANSACTION_READ_COMMITTED 
>           Dirty reads are prevented; non-repeatable reads and phantom reads 
> can occur.
> TRANSACTION_READ_UNCOMMITTED 
>           Dirty reads, non-repeatable reads and phantom reads can occur.
> TRANSACTION_REPEATABLE_READ 
>           Dirty reads and non-repeatable reads are prevented; phantom reads 
> can occur.
> TRANSACTION_SERIALIZABLE 
>           Dirty reads, non-repeatable reads and phantom reads are prevented.
> 
> Pro KrupickuM: Pokud si dobre vzpomniam, MySQL neumi transakce vubec :(
> 
> 
> Bye, Endy/Endif 
>                          ... please wait - loading a virus into your
> computer.

Bye

Medved

Si vis pacem, para bellum.

Search the boards