Posted By: medved (A~z na v~eky Mikov~ce.) on 'CZdatabases'
Title:     Re: Transakce (Wa deadlocky
Date:      Wed Mar  1 13:36:56 2000

> > > data. Pri zakazani nonrepeatable read se zamknou data uz pri prvnim
> select
> > > jiny uzivatel nam je nemuze zmenit.
> > Tzn, ze kdyz si dam treba:
> > begin transaction pepa
> >  select count(*) from pepa;
> >  nejaky-dlouhy-prikaz-treba-sleep-:);
> > rollback transaction
> > tak po celou dobu nejde do tabulky insertit, jelikoz bys mi v prubehu
> > transakce zmenil pocet radek?
> 
> V zavislosti na typu isolation level ano. Pokud ta transakce bude 
> serializovatelna, pak ostatni transakce budou cekat.

Takze je to takto:

izolacni uroven 2 (prevence nonrepeatable read) znamena, ze se zamknou radky 
dotcene selectem (*).
Ve vyse zminenem pripade se zamkne cela tabulka a nikdo jiny si neskrtne.

Jinak ale pri obecnem selectu to zavisi na tom, jaky druh zamku se pouzije. 
Pokud zamknes celou tabulku, tak si nikdo neskrtne, pokud zamknes pouze 
radky, tak vsichni ostatni mohou delat cokoliv s ostatnimi daty (treba i 
pridat phantom row - nejsme na is.lev.3)
A pokud zamykas na urovni databazovych stranek (bufferu, chunku... podle db 
vyrobce), tak je cast radek, ktere nespadaji do selectu pristupna (je na 
jinych db strankach) a cast ne.

Osetrovani a sprava zamku zabere velkou cast rezie db serveru, takze existuji 
parametry, ktere rikaji kdy se z row-level zamku stavaji page-level pripadne 
table-level zamky. 

> To ale neni nic proti tomu, kdyz ty transakce jsou trochu slozitejsi a muze 
> dojit k dead-locku:-). Pak sice db_engine spravne pozna dead-lock a
> odrolluje 
> nejakou transakci, ale situace se muze opakovat a vy nikdy neprovedete, co 
> jste chteli (setkal se s tim nekdo z vas?).

Setkal jsem se s aplikaci v Delphi (s BDE), ktera se deadlockovala sama (mela 
vice db koneksi).

Jinak je zde obecny navod, jak se muzes deadlockum vyhnout.

1) v transakcich necekat na uzivateluv vstup = kratsi transakce = mene zamku
2) v transakcich vzdy pouzivat tabulky ve stejnem poradi
3) poustet prikazy do db serveru po davkach (nekolika prikazech najednou)
4) pokud mozno pouzivat ulozene procedury - v nich jsou vzdy prikazy ve 
stejnem poradi a provadeji se rychleji

A pokud se chcete v transakcich rejpat jeste vice, doporucuji se podivat na 
nejaky z transakcnich serveru - tam se sdruzuji komponenty a jejich pohled na 
transakci (podporovana/vyzadovana/vyzadovana nova...) a stavy transakce 
(povoleny commit/zakazany commit/rollback...) 

> snake

Bye

Medved

Si vis pacem, para bellum.

Search the boards