|
![]() | Izolace transakcφ | ![]() | Transakce a body nßvratu | P°φkaz START TRANSACTION | ![]() |
Kombinovßnφ dvou odliÜn²ch mechanism∙ synchronizace po₧adavk∙ r∙zn²ch klient∙ - explicitnφho zamykßnφ a nastavenφ izolace transakcφ - m∙₧e vΘst k blokovßnφ klienta nebo k vrßcenφ chyby.
Nech¥ jeden klient zamkne pro p°epis zßznam Z.
Druh² klient polo₧φ dotaz, p°i jeho₧ zodpovφdßnφ je nutno testovat hodnoty ze zßznamu Z.
Pokud druh² klient mß nastavenou ·rove≥ izolace transakcφ SERIALIZABLE, pak je vytvß°enφ odpov∞di na dotaz pozastaveno do doby, ne₧ prvnφ klient odemkne zßznam Z nebo dokud nevyprÜφ limit doby Φekßnφ na zßmek. Po₧adavek na vytvo°enφ dotazu pak skonΦφ v druhΘm p°φpad∞ chybou.
Pokud dotaz mß takovou strukturu, ₧e dovoluje odlo₧enΘ vytvß°enφ, pak k chyb∞ dojde a₧ tehdy, kdy₧ se testuje hodnota ze zßznamu Z.
ProΦ prvnφ klient blokuje druhΘho klienta? Prvnφ klient mß dφky zßmku pro p°epis vyhrazeno prßvo kdykoli zm∞nit obsah zßznamu Z. Druh² klient nastavenφm izolace Serializable ₧ßdß, aby server zaruΦil, ₧e opakovanΘ polo₧enφ stejnΘho dotazu dß v₧dy stejnou odpov∞∩. Jeliko₧ se hodnoty zßznamu Z pou₧φvajφ p°i vyhodnocenφ dotazu, server toto zaruΦit nem∙₧e. Proto nem∙₧e povolit zodpov∞zenφ dotazu druhΘho klienta, dokud prvnφ klient vlastnφ zßmek. Situace mß za nßsledek Φekßnφ nebo chybu, podle nastaven²ch provoznφch parametr∙.
ProblΘm lze demonstrovat na tomto p°φkladu:
Mßme tabulku STRATAB vytvo°enou p°φkazem CREATE TABLE STRTAB (S CHAR(12)) - Tabulka mß jeden sloupec S obsahujφcφ °et∞zec znak∙, bez index∙. Tabulka nech¥ obsahuje alespo≥ jeden zßznam.
Program Lock: table strtab; begin Write_lock_record(strtab, 0); Info_box('', 'Locked'); Write_unlock_record(strtab, 0); end.
Program Select: var c:cursor; cnt:trecnum; begin Set_transaction_isolation_level(3); if Open_sql_cursor(c, 'select * from strtab where s<''zzzzz''') then Signalize else begin if Rec_cnt(c, cnt) then Signalize; Close_cursor(c); end end.
Prvnφ klient nejprve spustφ program Lock a nechß jej Φekat se zobrazen²m Info_boxem. Pak druh² klient spustφ program Select. Tento program se dostane do stavu Φekßnφ na zßmek (stav 3 v p°ehledu klient∙ na serveru).
Pokud stiskem tlaΦφtka OK v Info_boxu prvnφ klient pokraΦuje dßl a odstranφ zßmek, pak druh² klient vzßp∞tφ dokonΦφ vytvß°enφ kurzoru a takΘ skonΦφ bez chyby.
Pokud prvnφ klient neodstranφ zßmek v ΦasovΘm limitu, pak druh² klient skonΦφ s chybou "S objektem n∞kdo pracuje".
K vzßjemnΘmu blokovßnφ klient∙ nedojde, pokud druh² klient bude pou₧φvat ·rove≥ izolace transakcφ 1 (READ COMMITTED).
![]() | Izolace transakcφ | ![]() | Transakce a body nßvratu | P°φkaz START TRANSACTION | ![]() |