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.

Munkavégzés az adatbázist egy # 4

Á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).

Munkavégzés az adatbázist egy # 4

Á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).

Munkavégzés az adatbázist egy # 4

Á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)..

Munkavégzés az adatbázist egy # 4

Á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.

Munkavégzés az adatbázist egy # 4

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.

Munkavégzés az adatbázist egy # 4

Á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.

Kapcsolódó cikkek