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.