Nagyon zavart vagyok, hogy miként emésztem meg azt a tényt, hogy egy tranzakció atomi. Ha egy tranzakció “lekérdezések “ből áll, akkor hogyan lesz atomikus. A “lekérdezések” szót egy általános SQL lekérdezéshez kapcsolom. Ezért a tranzakció nem lesz más, mint egyidejűleg végrehajtott SQL lekérdezések halmaza. De az a tény, hogy minden lekérdezés több műveletet tartalmaz, nem igazán tudom, hogyan gördülnek vissza a korábban végrehajtott lekérdezések (ugyanabban a készletben), ha egy későbbi lekérdezésben hiba lép fel. Mit hiányolok itt? Köszönöm!
Válasz
TL; DR; A tranzakciós napló tartalmazza az összes tranzakció újrateremtéséhez vagy visszavonásához szükséges információt, attól függően, hogy tartalmaz-e az adott tranzakcióhoz tartozó végrehajtási rekordot.
Az SQL adatbázisokban a tranzakció az atomicitást leggyakrabban a előre írható naplózás (vagyis a tranzakciónapló bejegyzései előtt be vannak írva, a tényleges táblázatok és indexek frissülnek).
A szó szoros értelmében vett lekérdezések, azaz SELECT
utasítások és egyéb olvasási műveletek, amelyek nem változtatják meg az adatbázis állapotát, nincsenek naplózva, mivel nincs mit elkövetni vagy visszagurítani, és mint ilyen, az atomitás fogalma itt nem igazán érvényes, legalábbis a DBMS szintjén. Előfordulhat, hogy a lekérdezés eredményeit felemésztő alkalmazásnak meg kell erősítenie az atomicitást a korábbi lekérdezések eredményeinek elvetésével, ha a következő lekérdezések egyike sikertelen és visszagörgetést okoz.
Amikor a DML utasítások (INSERT
, UPDATE
, DELETE
, MERGE
) és az adatbázis állapotát megváltoztató egyéb utasítások végrehajtva, az általuk végrehajtott módosításokat először az előre írási naplóba (WAL) írják. Ha minden utasítás sikeres, és elkötelezettséget (kifejezett vagy hallgatólagos) adunk ki, ezt a tényt a WAL is rögzíti, és a napló megmarad. Ez teszi a változtatásokat tartóssá. Később, egy ellenőrzési pont vagy napló visszajátszás során kiírhatók a tényleges tábla- és indexszegmensekbe.
Ha azonban az egyik utasítás meghiúsul, a naplóban nem lesz végrehajtási rekord ezt a tranzakciót, és a DBMS visszavonja az eddigi táblázatok és indexek módosításait a tranzakció előző naplóbejegyzéseinek felhasználásával.
Hasonlóképpen, ha a DBMS folyamat összeomlik, vagy az áramellátás kialszik, akkor nem a repülés közbeni tranzakcióhoz is készítsen elkötelezett rekordot, és a táblázat vagy index változásai, amelyek esetleg már fennálltak, a napló visszajátszása során visszavonásra kerülnek.
Megjegyzések
- Ez nem ' nem helyes: " A szó szoros értelmében vett lekérdezések, azaz a SELECT utasítások és egyéb olvasási műveletek amelyek nem változtatják meg az adatbázis állapotát, nincsenek naplózva, mivel nincs mit végezni vagy visszagörgetni " – az adatbázis beállításaitól függően akár egy SELECT is elindíthatja az implicit tr ansaction. brentozar.com/archive/2018/02/…
- I ' nem mondom, hogy ' nincsenek tranzakcióellenőrzés alatt, azt mondom ', mivel ők semmit sem változtatnak, nincsenek naplózva.
Válasz
A tranzakció atomi, amikor úgy kapszulázódik, mint ez:
BEGIN TRAN UPDATE dbo.Users SET Reputation = Reputation + 1 WHERE Id = 26837; UPDATE dbo.Posts SET Score = Score + 1 WHERE Id = 227563; COMMIT
Ebben az esetben a két különálló tábla mindkét frissítése együttesen fog végrehajtani, vagy együtt gurul vissza (nem sikerül). ez a tranzakció legkisebb egysége, amely elkötelezi magát.
Ha azonban később megpróbál külön lekérdezést futtatni ezen a körön kívül, az külön tranzakció lenne.
Ha ilyesmivel próbálkozik:
BEGIN TRAN UPDATE dbo.Users SET Reputation = Reputation + 1 WHERE Id = 26837;
Ezután az alkalmazásában más típusú munkát végez, például C # kódot, majd visszatér az adatbázisba később, és tegye ezt:
UPDATE dbo.Posts SET Score = Score + 1 WHERE Id = 227563; COMMIT
Ezután a korábbi Felhasználók frissítése és az azt követő Bejegyzések frissítése egyaránt sikeres lesz, vagy sikertelen lesz.
Azonban a való életben nem tarthat nyitva olyan tranzakciót, mint hogy hosszabb ideig, mert megakadályozza, hogy más emberek végezzenek munkát az adatbázisban. Ezért gyakran lát olyan tanácsokat, mint például: “Tartsa a tranzakciót rövidnek és édesnek”, vagyis lépjen be, végezze el munkáját és térjen vissza. Ne tartsa kifejezetten nyitva a tranzakciókat.
Megjegyzések
- Egy tranzakció mindig atomi, nem ' ez?
- Igen, de az adatbázis beállításaitól függően előfordulhat, hogy be van kapcsolva az implicit tranzakciók – vagyis ' újra BEGIN TRAN megszerzése, még akkor is, ha nem kéri ' ezt. Ez szállítónként változó – például azt hallom, hogy az Oracle alapértelmezés szerint implicit tranzakciókat hajt végre, míg az SQL Server nem.GONDOLHATJA, hogy ' csak egy tranzakciót kap, ha Oracle háttérből érkezik, amikor az SQL Serverben több különböző tranzakciót is végezhet – amelyek mindegyike atomos lenne.