Mi az a holtpont, és hogyan kell harcolni

Kuzmenko Dmitry, Epsylon Technologies



Kezdjük azzal, hogy a szó szerinti fordítása patthelyzet azt jelenti, „dead lock”. Amikor dolgozik BDE (. Delphi, C ++ Builder) az ügyfél-oldali és IB Adatbázis kiváltó és tárolt eljárások, van két esetben az üzenet patthelyzet - olvasás és frissítése. Ahhoz, hogy az igazán „halott” blokkot nem jutottak, mert az IB SQL kapcsolat kezdődik bármilyen tranzakció NO WAIT paraméter (pl. E. Nem számíthat arra, hogy megoldja a konfliktust).


Holtpont, amikor frissít

Két ügylet még nem fejeződött be, de igyekszünk frissíteni ugyanazt a rekordot tartják versenyképes. Két mód kezelése patthelyzet - várjunk, nincs várakozás (az elvárás nélkül elvárás). A BDE bármilyen IB tranzakció módot használunk haladéktalanul, azzal az elvárással üzemmódban lehet beállítani csak a közvetlen munka IB API (például a FreeIBComponents).

„Szerencsétlen”, persze, úgy vélik, a tranzakció, kap egy üzenetet holtpont. Ez azt jelenti, hogy az egyik végzett tevékenységek a tranzakció nem hajtható végre. Ezért ez a tranzakció érvényteleníteni kell (rollback). Kerülje a hosszan futó tranzakciók lehet bejutni a helyzet - az egyetlen kiút belőle megpróbálja elindítani a tranzakciót, és ismételjük meg a lépéseket.

Számának csökkentése esetleges konfliktusok dátuma csökkentheti az átfutási idő a tranzakció. Például, az adatokat a felhasználó először elfogadta, és ha megerősíti a megadott információk, az alkalmazás megkezdi a tranzakció gyorsan továbbítja az adatokat a szerverre, és végződik. Minél gyorsabban halad a tranzakció, annál valószínűbb, hogy sikeresen befejeződött. Ez az, amiért a BDE 3.x bevezetett Gyorsítótárazva Frissítés mód (cache változások). Amikor Trolt frissítések változások felhalmozódnak a kliens oldalon a kérelem, akkor a módszer hívás ApplyUpdates változás „kirúgták” a szerveren. Mindenesetre, még ha nem tud megszabadulni a hosszú megújulás ügylet, meg kell vizsgálni az alkalmazás logikáját, és biztos, hogy tartalmazza az alkalmazás folyamatában felmerülő konfliktusokat.

Holtpont az olvasás

Figyelem! Minden alább leírt problémák kerültek meghatározásra a BDE 4.01. A paraméter DRIVER zászlók nincs szükség.

Holtpont merül fel, amikor olvasni alapvetően SQL-szerverek, amelyek használata az oldal-lock olvasásakor vagy módosítása adatok (MS SQL és a Sybase). Különös, hogy amikor dolgozik az IB, ahol a zár létezik (a konfliktus frissítés zár nem tekinthető - nem zár, azaz a konfliktus), néha még mindig előfordul holtpont, amikor az adatok olvasását.

Az ok a következő: a tranzakció izolációs szint Olvasás elkövetett IB két mód - nincs feljegyzés VERSION és RECORD verzióra (lásd a leírást az ügylet paramétereit.). Az első esetben, ha az olvasó a felvétel IB kernel érzékeli a jelenlétét meg nem erősített (lekötetlen) változata ez a rekord, akkor visszatér az üzenetet patthelyzet. Olyan ez, mintha az alkalmazás jelzi, hogy hamarosan ez a rekord lehet frissíteni (valójában a rossz ReadCommitted változások láthatók lesznek után azonnal megerősítette (véglegesítés)). A RECORD VERSION módban jelenlétében jóváhagyott változat a bejegyzések figyelmen kívül hagyja, és mindig visszatér a régi verziót a felvételt.

Úgy tűnik, hogy miért nem működik BDE alapértelmezett RECORD VERSION mód? Sajnos, ez az eredetileg megállapított - Olvasd el véglegesített tranzakció a BDE fut a lehetőséget NO RECORD VERSION - de verzió Delphi 2.0 kellemetlenséget szinte senki nem vette észre. De miért nem vette volna észre, olvasson tovább.

Az izolációs szint AUTOCOMMIT különböző változatai BDE

Attól függően, hogy a változat a BDE megváltoztatta az alapértelmezett szint elszigetelten. Ha nem kifejezetten a vezetési módszerek ügyletek (Database.StartTransaction, Commit és Visszagörgetés), akkor az Ön számára ez teszi BDE. Nem hiszel nekem? Nézze meg az SQL Monitor. A legfontosabb, hogy milyen típusú az alapértelmezett művelet „varrt fel” a SQL link. És akkor is, ha az űrlapon egy TDatabase komponens és megváltoztatta a tiTransIsolation tulajdon, ez nem befolyásolja a BDE, amíg meg nem hívja Database.StartTransaction módszer.

Tehát mi a tranzakció elindul az alapértelmezett BDE.
  • Delphi 1.0, BDE 2,52 - Repeatable Read
  • Delphi 2.0, BDE 3.x - Olvasd Elkötelezett
  • Delphi 3.0, 4.0 BDE - Olvasd Elkötelezett
  • Delphi 3.01, BDE 4.01, 4.51 - Olvassa elkötelezett paraméterrel RECORD VERSION - holtpont-és az olvasás hiányoznak.

Így holtpont-és olvasás észre csak Delphi 2.0 azért van, mert az ügylet az alapértelmezett változott olvasása elkövették. By the way, READLINK.TXT Delphi 2.x és 3.0 mondja, hogy ha meg akarja változtatni az alapértelmezett művelet a Repeatable Read, be kell állítania DRIVER zászlók meghajtó beállítások = 512 e. Valójában „a kompatibilitást” alkalmazás viselkedését, át 2 egy Delphi Delphi 1.

Figyelem! Ne telepítse az illesztőprogramot zászlók, olvasás előtt READLINK.TXT.

Az a tény, hogy például, 4.0 verzió száma zászlók nőtt:
  • 0 Read elkötelezett, azonnali megerősítését változások (okozhat újraolvasás TQuery kurzorok)
  • 512 Repeatable Read, azonnali megerősítését változások (okozhat újraolvasás TQuery kurzorok)
  • 4096 Read elkövetett, mint egy megerősítő végzett változtatásokról COMMIT TARTÁSUK, miközben a kurzor összefüggésben TQuery
  • 4608 ismételhető olvasás, a változtatás jóváhagyása kerül végrehajtásra COMMIT TARTÁSUK, miközben a kurzor összefüggésben TQuery