Výskyt této hlášky může:
- být naprosto korektní
- ukazovat na chybné ošetření zápisu do sdíleného souboru z procedury
- ukazovat na potřebu promyslet analytické dopady některých programových řešení.
Stručný popis: Tato hláška se může vyskytnout jen na sdílených souborech. Použije se v datovém editoru. Při ukončení editace (stávající) věty FAND nejprve kontroluje, zda náhodou během editace věty v editačním bafru nedošlo ke změně fyzického stavu věty. Pokud zjistí, že došlo, vypíše uvedenou hlášku a obnoví stav editačního bafru podle aktuálního stavu souboru. |
Uvedený postup datového editoru vlastně zabraňuje DEADLOCKu v určité situaci (někdo změnil větu kterou edituji), kterou vlastně nelze řešit jinak (pokud již nastala). Lze ale rozebrat důvody, proč vlastně může nastat a případně výskyt těchto důvodů omezit na minimum.
Podrobnější popis
Při řešení požadavku na současnou práci více stanic s jednou větou se používají (obecně, nejen v PC FANDu) dvě strategie:- Pesimistická strategie
Při provedení změn do věty souboru se (pesimisticky) předpokládá, že se i jiná stanice pokusí v průběhu editace do věty provést svoje změny. Aby se tomu zabránilo, uzamkne první stanice větu po celou dobu editace. Druhá stanice nemůže větu začít editovat. Takže změny ve větě provede ta stanice, která začně dříve s editací. - Optimistická strategie
Při provedení změn do věty souboru se (optimisticky) předpokládá, že během editace se jiná stanice nepokusí o totéž (provést změny ve stejné větě). Pokud se tak přece jen stane, uplatní své změny ta stanice, která ukončí editaci (provede zápis změn) jako první. Takže změny ve větě provede ta stanice, která editací dříve ukončí.
V PC FANDu je jedna situace, kdy dojde k tomu, že datový editor nerespektuje zámek na větě a propíše změny i do uzamčené věty. Je to v případě, že při potvrzení změn ve větě (ukončení editace věty) se mají provést aditivní změny do nadřízených souborů. Tyto změny se postupně kaskádovitě provádějí (úrovní nadřízenosti může být více) a při tom se narazí v nějakém nadřízeném souboru na uzamčenou větu. V tomto případě se změny propíšou i přes zámek. Jiné možné řešení by bylo stornování (ROLLBACK) všech dosud provedených změn. Kromě toho, že FAND ROLLBACK (transakce) nepodporuje by toto řešení mělo i jiné analytické dopady.
No a pokud ona uzamčená věta nadřízeného souboru byla právě editována z jiné stanice, provede před propsáním svých změn výše uvedenou kontrolu. Zjistí aditivní změnu a nahlásí onu hlášku, o kterou se jedná.
Je na místě připomenout, že blokování a zamykání datového editoru nelze přímo ovlivnit (ani to nemá smysl). Takže při konkurenční práci datových editorů řeší uvedený postup při provádění aditivních změn vlastně situaci typu DEADLOCK. Jde o aplikaci optimistické strategie sdílení vět.
Ovšem, podobné situace mohou nastat při změnách, které se provádí z procedur. Např. změna z procedury do věty, kterou jiná stanice edituje. Zde se uplatní příkaz WITH LOCKED.
Dvě důležité upozornění na závěr
- Aby nedošlo k omylu je nutno zdůraznit, že v uvedených situacích lze sice prolomit zámek na větě, ale nikdy nelze prolomit mod blokování (WITH SHARED). Ono prolomení zámku také vlastně vypadá tak, že v situaci, kdy mody blokování souboru umožňují více stanicím zápis do souboru (všechny stanice mají nejvýše mod NoCr) jedna ze stanic se na případné uzamčení věty prostě nezeptá.
- Pro jednoduchost se zatím hovořilo o jiné stanici, která přepíše rozeditovanou větu. Je nutno upřesnit, že původní stav věty může přepsat i ta samá stanice - ta samá aplikace - např. v exit-proceduře v rámci aktuální editace. Z hlediska datového editoru je přímý přístup (zápis soubor[edrecno].udaj:= ) z exit-procedury do editované věty považován za nekorektní. Korektně se s editovanou větou pracuje přes parametr record of editovaný soubor.
Příkaz WITH LOCKED sám o sobě nezabrání ostatním stanicím v přístupu k uzamčené větě. Zabrání v přístupu jen těm, které se na zámek zeptají = také zkusí WITH LOCKED.
Něco k tomuto tématu je uvedeno v Referenční příručce str. 210 a nebo v učebnici PC FAND krok za krokem, str. 287.