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.