Munkavégzés az adatbázist egy # 4
4.3.5. ügyletek
A tranzakció sorozata parancsok végrehajtása (SQL-struktúrák) egy adatbázis, amely akár fix a sikeres végrehajtása minden parancsot vagy törölhető, ha sikertelen végrehajtása legalább egy csapat. A legtöbb modern adatbázisok támogatják tranzakciós mechanizmus, és a túlnyomó többsége a kliens alkalmazások, hogy velük dolgozni, használt maguknál csapatok tranzakciót.
Felmerül a kérdés - miért van szükség tranzakciókat? Képzeljük el, hogy a BDTur_firm2 adatbázis beszúrni kívánt kapcsolódó rekordok két táblázat - „A turisták” és „Információk a turisták számára.” Ha a rekord kell illeszteni az asztalon „turisták” rossz lesz például miatt rossz meghatározott turisztikai kódot, az adatbázis nem teszi lehetővé, hogy a változás, de a „Tájékoztatás a turisták felesleges táblázat bejegyzés jelenik meg. Vegyük ezt a példát.
Fuss a Management Studio, az új formában, akkor be kérelmet, hogy két feljegyzések:
Két bejegyzések sikeresen bekerült az adatbázisba:
(1 sor (ok) az érintett) // vagy (feldolgozott sorok: 1)
(1 sor (ok) az érintett) // vagy (feldolgozott sorok: 1)
Most provokál hiba - váltás kód csak turista a második lekérdezés:
Az üzenetet a lehetetlensége behelyezése az első rekord a meglévő kulcs értékét területen. A második rekord, de a táblázatba:
Üzenet 2627, 14. szint, az állami 1, 1-es vonal
Megsértése elsődleges kulcs megszorítás „PK_Turisty”. Nem lehet behelyezni duplikált kulcs objektum dbo.Turisty ".
A nyilatkozat megszűnt.
(Feldolgozott sorok: 1)
Kivonat tartalmát mindkét asztal a következő kettős lekérdezés:
SELECT * FROM turisták
SELECT * FROM [Információ turisták]
A táblázatban az „Információk a turisták utolsó rekord hozzáadása nélkül kapcsolat a” turisták „táblázat bejegyzés (ábra. 99). Annak érdekében, hogy elkerüljék az ilyen hibák, meg kell alkalmazni az ügylet.
Ábra. 99. Az a táblák tartalma „turisták” és „Információk az turisták” - Blackout
Az összes bejegyzés törléséhez készült mindkét asztal és végrehajthat SQL-forrás szerkezet formájában ügylet:
Indítsuk el a tranzakció deklarálva BEGIN TRAN parancsot. Következő két lehetőség - @OshibkiTabliciTourists, OshibkiTabliciInfoTourists hiba gyűjtemény. Miután az első lekérdezés visszaadja az értéket, amely beépített függvény @@ ERROR hozzárendeli az első paraméter:
Ugyanez a helyzet, miután a második kérelmet egy paraméter
Megvizsgáljuk az értékek mindkét paraméter nullának hiányában hibák:
IF @ OshibkiTabliciTourists = 0 @ OshibkiTabliciInfoTourists = 0
Ebben az esetben mi megerősítik a tranzakciót (ebben az esetben a módosítás) a COMMIT TRAN parancsokat. Ellenkező esetben - ha legalább az egyik paraméter @OshibkiTabliciTourists @OshibkiTabliciInfoTourists és nullától eltérő, törölje a tranzakciót a ROLLBACK TRAN parancsot.
A tranzakciót követően megjelenik a további két sor:
(Feldolgozott sorok: 1)
(Feldolgozott sorok: 1)
Ismét változik a kódot a turista a második lekérdezés:
Fuss egy tranzakció - van pontosan ugyanazt az üzenetet, mint abban az esetben, hagyományos lekérdezés:
Üzenet 2627, 14. szint, az állami 1, 3. sor
Megsértése elsődleges kulcs megszorítás „PK_Turisty”. Nem lehet behelyezni duplikált kulcs objektum dbo.Turisty ".
A nyilatkozat megszűnt. (Feldolgozott sorok: 1)
Most azonban a változások nem szerepelnek a második táblázat (ábra. 100).
Ábra. 100. Az a táblák tartalma „turisták” és „Információk az turisták” után sikertelen tranzakció
Post (1 sor (ok) az érintett), jelezve, „hozzáadva” bejegyzés, ebben az esetben, ez csak azt jelenti, hogy a második SQL-szerkezet helyes, és a felvétel adhatunk esetén sikeres a tranzakció.
Így a tranzakciós motor támogatja az adatok integritását két tábla között, ami nem teszi lehetővé azt, hogy sérti a kiegészítéssel, hibás adatokat.
Nézzük tranzakciók ADO .NET. Hozzon létre egy új konzol alkalmazás Easy tranzakció. Mi jelent meg a problémát: hogy adja át ugyanazt az adatot két táblázat - „A turisták” és „Információk a turisták számára.”
A teljes lista az alkalmazás a következő:
Az alkalmazás megkezdése előtt újra kivegye az összes bejegyzést a táblából. Siker esetén egy üzenet jelenik meg, és a táblázatban adunk a felvételi (ábra. 101).
Ábra. 101. függelék EasyTransaction. A tranzakció történt
Újraindítása ezt az alkalmazást vezet eltérés a tranzakció - lehetetlen beszúrni rekordokat azonos értékű elsődleges kulcsok (102 ábra)..
Ábra. 102. függelék EasyTransaction. A tranzakciót elutasítja
A tranzakció, akkor lehet, hogy ki a végrehajtását egy vagy több a tárolt eljárásokat - sőt, az általános tervezési a következő:
// Létrehozunk kapcsolat
. cm. példában EasyTransaction alkalmazása
// Létrehozunk az ügylet
myCommand.Transaction = conn.BeginTransaction ();
megpróbál <
// a parancs végrehajtásához, hívja egy vagy több a tárolt eljárások
// erősítse meg a tranzakció
myCommand.Transaction.Commit ();
>
catch (Exception ex) <
// elvetjük a tranzakciót
myCommand.Transaction.Rollback ();
>
végül <
// A kapcsolat bezárásához
conn.Close ();
>
Amikor az ügylet több felhasználó egy adatbázis a következő problémákat tapasztalhatja:
1. Piszkos olvasás - «piszkos» olvasás. Az első felhasználó elindít egy tranzakciót, amely módosítja az adatokat. Ekkor egy másik felhasználó (vagy a tranzakció létre őket) kivonatok részben megváltozott adatok nem pontosak.
2. Nem ismételhető olvasás - megismételhetetlen olvasni. Az első felhasználó elindít egy tranzakciót, amely módosítja az adatokat. Ekkor egy másik felhasználó kezdődik és végződik egy másik tranzakciót. Az első felhasználó a második olvasatban az adatok (például, ha több olyan ügyletet kimutatások SELECT) kap egy sor különböző rekordokat.
3. Phantom olvas - olvasás fantomok. Az első felhasználó elindít egy tranzakciót, válassza ki az adatokat a táblázatban. Ekkor egy másik felhasználó kezdődik és végződik egy tranzakciót, beszúrni vagy törölni rekordokat. Az első felhasználó kap egy másik adathalmazt tartalmazó fantomok - törölt vagy módosított sorokat.
Ahhoz, hogy megoldja ezeket a problémákat, négy szintű tranzakció izolációs fejlesztik:
1. Olvassa el nem kötelezett. A tranzakció olvashat adatokat más ügyleteket, amelyek működnek. Az ezzel elkülönítési szint vezethet mindezeket a problémákat.
2. Olvasd elkövetett. A tranzakció nem tudja olvasni az adatokat, amelyek más ügyletek működik. Az ezzel izolációs szint megszünteti a problémát a „piszkos” olvasás.
3. Repeatable olvasni. A tranzakció nem tudja olvasni az adatokat, amelyek más ügyletek működik. Egyéb műveletek is nem tud olvasni az adatokat, működik ez a tranzakció. Az ezzel izolációs szint, elkerülhetőek, kivéve olvasás fantomok.
4. Serializable. A tranzakció teljesen el van szigetelve más ügyletek. Az ezzel izolációs szint, elkerülhetőek.
A legmagasabb szintű elszigeteltség (Serializable) azt a maximális biztonságot és ezzel egyidejűleg a legkisebb teljesítményű - az összes tranzakciót hajtanak végre egy sor későbbi kénytelenek várni a befejezése az előzőt. Ezzel szemben, a használata a legalacsonyabb szint (Read lekötetlen) a maximális teljesítmény és a teljes biztonság hiánya. Azonban ez lehetetlen, hogy az egyetemes ajánlásokat használata ezeken a szinteken - minden egyes konkrét helyzetben, a döntés attól függ, az adatbázis szerkezete és jellege a lekérdezés.
Állítsa be az elkülönítési szintet használjuk a következő parancsot:
SET ÜGYLETI izolációs szint
OLVASSA nem kötelezett
vagy READ COMMITTED
vagy megismételhető READ
vagy serializable
Például, a tranzakció, amely hozzáteszi, két bejegyzés, az izolációs szint van megadva a következők szerint:
BEGIN TRAN SET ÜGYLETI izolációs szint Serializable
DECLARE @OshibkiTabliciTourists int, int @OshibkiTabliciInfoTourists
.
ROLLBACK TRAN
Az ADO .NET elkülönítési szintet lehet beállítani, ha létrehoz egy ügylet:
myCommand.Transaction = conn.BeginTransaction (System.Data.IsolationLevel.Serializable); Továbbá által támogatott további két szinten (104. ábra):
1. káosz. A tranzakció nem tudja felülírni más nem kötött tranzakciók magas szintű szigetelést, de lehet felülírni változások alkalmazása nélkül a tranzakciót. Ezek a munkák a jelenlegi tranzakció nem blokkolja;
2. Nem meghatározott. Külön izolációs szint, amelyet fel lehet használni, de nem lehet meghatározni. Tranzakciós ezen a szinten lehet használni, hogy adja meg az egyéni izolációs szint.
Ábra. 104. meghatározása tranzakció szintű
Tranzakciók integritásának biztosítása érdekében az adatbázis, a fejlesztési többrétegű alkalmazások használatuk kötelező szabály.