Gagnasafnsfræði, haust 2011
[ Dagskrá | Námsefni | Verkefni | Dæmatímar | Orðalisti | Námsmat | Kennslubók ]Verkefni 10 - Samskeiða vinnsla hreyfinga
Lausnum skal skilað í hólf viðkomandi dæmakennara (sjá lista yfir dæmatíma).Skiladagur: þriðjudaginn 15. nóvember fyrir kl 16:00
Skiladæmi:
-
Gerum ráð fyrir MVCC kerfi eins og í PostgreSQL.
Hreyfing með raðnúmer 100 les eftirfarandi töflu með einangrunarstig READ COMMITTED. Tilgreinið hvaða raðir eru sýnilegar í töflunni fyrir þá hreyfingu.
Eftirfarandi hreyfingar eru ennþá opnar (ókláraðar) þegar lesturinn er framkvæmdur: 50, 70.
Eftirfarandi hreyfingar voru kláraðar með commit: 20, 60, 80, 90, 110, 120
ID xmin xmax Sýnileg 1 20 Já 2 110 Já 3 20 90 Nei 4 80 120 Nei 5 60 70 Já 6 50 Nei -
Gerum ráð fyrir eftirfarandi töflu:
CREATE TABLE test (a INTEGER, b CHAR(1) NOT NULL);
Gerum ráð fyrir einni röð í töflunni:INSERT INTO test (a,b) VALUES (1, 'X');
Skoðið eftirfarandi keyrslu í tveimur samhliða psql skeljum og svarið síðan spurningunum fyrir neðan.Skipun nr. T1 (txid=711) T2 (txid=712) 1 BEGIN; -- txid=711 2 SET TRANSACTION ISOLATION LEVEL READ COMMITTED; 3 SELECT *,xmin,xmax FROM test; Output:
hhg=# select *,xmin,xmax from test; a | b | xmin | xmax ---+---+------+------ 1 | X | 710 | 0 (1 row)
4 BEGIN; -- txid=712 5 SET TRANSACTION ISOLATION LEVEL READ COMMITTED; 6 UPDATE test SET b='Y' where a=1; 7 SELECT *,xmin,xmax FROM test; Output:
hhg=# select *,xmin,xmax from test; a | b | xmin | xmax ---+---+------+------ 1 | X | 710 | 711 (1 row)
8 COMMIT; 9 SELECT *,xmin,xmax FROM test; Output:
hhg=# select *,xmin,xmax from test; a | b | xmin | xmax ---+---+------+------ 1 | Y | 711 | 0 (1 row)
Spurningar:
-
Í úttaki úr skipun nr. 7 þá er b=X þrátt fyrir að skipun 6 hafi sett b=Y. Af hverju?
Svar:
Því hreyfing 711 er óstaðfest og þar sem hreyfing 712 er með einangrunarstig READ COMMITTED þá sér hún ekki breytinguna fyrr en hún hefur verið staðfest (committed).
-
Í úttaki úr skipun nr. 7 þá er xmax=711, en txid fyrir T2 er 712. Röðin var úreld í hreyfingu sem er eldri en T2 og ætti því undir venjulegum kringumstæðum að vera ósýnileg.
En af hverju er hún þá sýnileg í úttakinu?
Svar:
Hreyfing 711 er ennþá í gangi og þessvegna er "gamla röðin" ennþá sýnileg.
-
Í skipun nr. 9 þá er b=Y og xmin=711. Af hverju er gamla röðin ekki sýnileg lengur? Af hverju er nýja röðin sýnileg?
Svar:
Nú er búið að staðfesta hreyfingu 711 sem úreldi gömlu röðina og því er hún ekki lengur sýnileg. Nýja röðin er sýnileg í hreyfingu 712 því það er búið að staðfesta hreyfingu xmin=711 og hreyfing 712 er með einangrunarstig READ COMMITTED.
-
Í úttaki úr skipun nr. 7 þá er b=X þrátt fyrir að skipun 6 hafi sett b=Y. Af hverju?
-
T1 T2 T3 R(A) W(B) R(C) R(C) W(A) R(B) Svar:
Skítugur lestur (feitletrað), T1 les breytinguna sem T2 gerði á B án þess að T2 hafi verið staðfest (committed).
-
T1 T2 T3 R(A) W(B) R(C) R(C) W(A) R(B) Svar:
Engin vandamál.
-
T1 T2 T3 W(A) R(B) R(C) R(C) R(A) W(B) Svar:
Engin vandamál.
T1 | T2 |
---|---|
R(A) | |
R(A) | |
R(B) | |
W(A) | |
R(C) | |
W(C) | |
R(C) | |
W(S) | |
Commit | |
Commit |
Svarið eftirfarandi spurningum:
-
Er þessi verkröð raðbindanleg (e. serializable) ? Útskýrið.
Svar:
Nei, því T1 les A áður en T2 breytir því, en T1 les C eftir að T2 breytir því.
Því getur T1 hvorki verið á undan T2, því þá kemur C rangt út, né T2 verið á alfarið á undan T1, því þá kæmi A rangt út.
-
Setjið inn lása í verkröðina samkvæmt stífri 2ja fasa læsingu (e. Strict 2PL)
Svar:
T1 T2 S(A) R(A) S(A) R(A) S(B) R(B) S(C) R(C) X(S) W(S) Commit X(A) W(A) S(C) R(C) X(C) W(C) Commit