Mi az a holtpont, és hogyan kell harcolni

Dmitry Kuzmenko
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 minden tranzakció a lehetőséget nincs várakozás (azaz nem várnak a konfliktus rendezéséhez).

Holtpont, amikor frissít

Két ügylet még nem fejeződött be, de igyekszünk frissíteni egy és 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 (pl 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 a tranzakció idején. 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

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 blokkoló nevezetesen 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Ó. 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. Ez olyan, 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űnt, lenne, miért lenne-BDE nem működik alapértelmezésben a RECORD VERSION módot. 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 ugyanazon ügylet alapértelmezetten elindít 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 a Delphi 2.0, ez azért van, mert az alapértelmezett művelet változik 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 a paramétereket a vezető DRIVER flags = 512 Ez azt jelenti, valójában „biztosítja kompatibilitás” viselkedése az alkalmazás, át Delphi Delphi 2 1.

Ne telepítse az illesztőprogramot zászlók olvasása előtt READLINK.TXT. Az a tény, hogy például a 4.0 a zászlók száma 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

Kapcsolódó cikkek