KZ BD w09 id 256667 Nieznany

background image

Bazy danych – wykład dziewi ˛

aty

Transakcje

Konrad Zdanowski

Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

1 / 42

background image

Outline

1

Transakcje

Problemy interakcji

2

Metody usuwania konfliktów

Szeregowalno´s´c
Blokady
Zakleszczenia
Misc

3

Transakcje i blokady w BD Oracle

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

2 / 42

background image

Problemy współbie˙zno´sci

Je´sli BD komunikuje si ˛e tylko z jednym u˙zytkownikiem, nie
powstaje problem konfliktowych operacji.

W praktyce BD musz ˛

a cz ˛esto zapewnia´c równoległo´s´c dost ˛epu.

Przykłady: rezerwacje biletów, operacje bankowe, sklepy
internetowe, ...

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

3 / 42

background image

Problemy współbie˙zno´sci

Rozwa˙zmy dwie transakcje:

T

1

: read(X), write(X,1), read(Y), write(Y,2);

T

2

: read(X), write(X,4), read(Y), write(Y,3);

Jak ˛

a warto´s´c bed ˛

a miały X i Y po zako ´nczeniu działania T

1

i T

2

?

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

4 / 42

background image

Problemy współbie˙zno´sci

Rozwa˙zmy ci ˛

ag operacji transakcji

T

1

i

T

2

:

1

Wczytaj wolne miejsca

,

2

Wczytaj wolne miejsca

,

3

Rezerwuj miejsce 13

,

4

Rezerwuj miejsce 13

.

Nie chcemy, ˙zeby

T

2

zapisała miejsce zaj ˛ete ju˙z przez

T

1

.

Nie byłoby problemu, gdyby transakcje wykonywane były jedna po
drugiej (nierealne).

Transakcja

T

1

powinna zablokowa´c zaj ˛ety rekord, transakcja

T

2

powinna by´c wycofana (ale nie warto zakłada´c blokady na

wszystkie

wolne miejsca przed wczytaniem ich przez

T

1

.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

5 / 42

background image

Transakcje

Definicja 1

Transakcja jest to ci ˛

ag operacji na bazie danych, które powinny by´c

wykonane w sposób atomowy, jak jedna instrukcja.

Je´sli nie b ˛edzie mo˙zna wykonac jednej z instrukcji w transakcji,
trzeba anulowa´c efekt wszystkich.

Standard SQL domy´slnie wymaga, ˙zeby transakcje traktowa´c jako
przetwa˙zane szeregowo. W praktyce implementacje BD pozwalaj ˛

a

na osłabienie tego wymagania w celu zwi ˛ekszenia efektywno´sci.

Transakcje zatwierdzamy przez

commit, anulujemy przez

rollback.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

6 / 42

background image

Własno´sci transakcji – ACID

Atomowo´s´c (atomicity) – transakcja wykona si ˛e albo w cało´sci
albo wcale,

Spójno´s´c (consistency) – przeprowadzi baz ˛e danych ze stanu
spójnego do spójnego,

Isolacja (isolation) – wynik jej działania b ˛edzie niezale˙zny od
innych działaj ˛

acych w tym czasie transakcji,

Trwało´s´c (durability) – wyniki jej działania s ˛

a trwałe.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

7 / 42

background image

Przyczyny konfliktów

Je´sli dwie transakcje chc ˛

a zapisa´c ten sam rekord, to wchodz ˛

a ze

sob ˛

a w konflikt.

´

Zródłem problemów jest te˙z sytuacja, w której jedna transakcja
zapisuje dane, które chce odczyta´c druga.

Je´sli dwie transakcje tylko odczytuj ˛

a dane, to nie mog ˛

a wej´s´c ze

sob ˛

a w konflikt.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

8 / 42

background image

Outline

1

Transakcje

Problemy interakcji

2

Metody usuwania konfliktów

Szeregowalno´s´c
Blokady
Zakleszczenia
Misc

3

Transakcje i blokady w BD Oracle

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

9 / 42

background image

Odczyt „brudnych danych”

Rozwa˙zmy scenariusz:

T

1

T

2

update Miejsca set zajete = true
where numer = 13;

select numer from Miejsca
where zajete = false;

no rows selected

.

rollback;

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

10 / 42

background image

Odczyt „brudnych danych”

Definicja 2

Odczyt „brudnych danych” ma miejsce kiedy jedna transakcja
odczytuje dane, które zmieniła druga transakcja, która została potem
wycofana.

Uwaga. To sie nie ma prawa zda˙zy´c w BD Oracle.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

11 / 42

background image

Niepowtarzalny odczyt

Rozwa˙zmy scenariusz:

T

1

T

2

select min(a) from r;

MIN(A): 8

delete from r where a=8;
insert into r values (5);
commit;

select max(a) from r;

MAX(A): 5

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

12 / 42

background image

Niepowtarzalny odczyt

Definicja 3

Niepowtarzalny odczyt wyst ˛epuje kiedy transakcja odczytuje dwa razy
te same dane i otrzymuje inne wyniki, gdy˙z zostały one zmienione
przez inn ˛

a, zatwierdzon ˛

a transakcj ˛e.

Transakcja T

2

nie odczytała niezatwierdzonych danych, ale otrzymała

niespójne odpowiedzi: max(a) < min(a).

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

13 / 42

background image

Fantomowe dane

Rozwa˙zmy scenariusz:

T

1

T

2

select a from r;

A: 1, 2, 8

insert into r values (5);
commit;

select a from r;

A: 1, 2, 8, 5

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

14 / 42

background image

Fantomowe dane

Definicja 4

Fantomowe dane pojawi ˛

a sie, kiedy transakcja odczytuj ˛

ac dwa razy te

same dane otrzymuje za drugim razem wi ˛ecej wyników.

Przy tej anomalii nie wyst ˛

apiłby problem typu: max < min.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

15 / 42

background image

Poziomy izolacji transakcji

Wyró˙zniamy nast ˛epuj ˛

ace poziomy izolacji transakcji:

Z odczytem niezatwierdzonych danych (uncommited read).

Z odczytem zatwierdzonych danych (commited read).

Z odczytem powtarzalnym (repeatable read).

Sekwencyjny (serializable).

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

16 / 42

background image

Poziomy izolacji transakcji

Dopuszczalno´s´c anomalii przy poziomach izolacji:

Poziomy izolacji

„brudne

niepowtarzalno ´s ´c

dane

dane”

fantomowe

uncommited read

tak

tak

tak

commited read

nie

tak

tak

repeatable read

nie

nie

tak

serializable

nie

nie

nie

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

17 / 42

background image

Outline

1

Transakcje

Problemy interakcji

2

Metody usuwania konfliktów

Szeregowalno´s´c
Blokady
Zakleszczenia
Misc

3

Transakcje i blokady w BD Oracle

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

18 / 42

background image

Outline

1

Transakcje

Problemy interakcji

2

Metody usuwania konfliktów

Szeregowalno´s´c

Blokady
Zakleszczenia
Misc

3

Transakcje i blokady w BD Oracle

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

19 / 42

background image

Szeregowalno´s´c

Niech t, s, w bed ˛

a zmiennymi transakcji a X , Y , Z , W rekordami w

bazie danych.

Transakcje T

i

mo˙zemy potraktowa´c jako ci ˛

ag instrukcji read(i,X,s),

write(i, X,s).

Ci ˛

ag instrukcji r

1

, . . . ,

r

n

jest

szeregowy

je´sli wszystkie instrukcje

ka˙zdej transakcji wyst ˛epuj ˛

a w jednym podci ˛

agu.

Ci ˛

ag instrukcji r

1

, . . . ,

r

n

jest

szeregowalny

je´sli je´sli istnieje

szeregowy ci ˛

ag instrukcji r

0

1

, . . . ,

r

0

n

, którego wykonanie dla

wszystkich stanów bazy danych daje ten sam efekt.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

20 / 42

background image

Szeregowalno´s´c

Je´sli ci ˛

ag instrukcji jest szeregowalny, to mo˙zemy traktowa´c transakcje

jakby były wykonywane sekwencyjnie.

Osi ˛

agamy najwy˙zszy mo˙zliwy poziom izolacji.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

21 / 42

background image

Szeregowalno´s´c – przykład

Ci ˛

ag instrukcji:

read(1, X,t), write(1, X, t+10);

read(2, X, s),

write(2, X, s*3);

read(1, Y, t); write(1,Y, t+10);

read(2, Y, s);

write(2, Y, s*3);

nie jest szeregowy ale jest szeregowalny.

Równowa˙zny ci ˛

ag to:

read(1, X,t), write(1, X, t+10); read(1, Y, t);

write(1,Y, t+10);

read(2, X, s), write(2, X, s*3); read(2, Y, s);

write(2, Y, s*3);

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

22 / 42

background image

Szeregowalno´s´c – przykład

Ci ˛

ag instrukcji:

read(1, X,t), write(1, X, t+10);

read(2, X, s),

write(2, X, s*3); read(2, Y, s); write(2, Y, s*3);

read(1, Y, t);

write(1,Y, t+10);

nie jest szeregowalny.

Ci ˛

ag instrukcji:

read(1, X,t), write(1, X, t+10);

read(2, X, s),

write(2, X, s + 30); read(2, Y, s); write(2, Y, s + 30);

read(1, Y, t);

write(1,Y, t+10);

jest szeregowalny tylko z powodu przmienno´sci

dodawania.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

23 / 42

background image

Outline

1

Transakcje

Problemy interakcji

2

Metody usuwania konfliktów

Szeregowalno´s´c

Blokady

Zakleszczenia
Misc

3

Transakcje i blokady w BD Oracle

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

24 / 42

background image

Blokady

W praktyce szeregowalno´s´c jest zbyt silnym wymogiem.

Szeregowanie transakcji mogłoby spowodowa´c zbyt długi czas
działania poszczególnych transakcji.

Bardziej realistycznym rozwi ˛

azaniem s ˛

a słabsze poziomy izolacji.

W celu ich zapewnienia mo˙zna stosowa´c mechanizmy takie jak
blokady wierszy lub (rzadziej) całych tabel.

Uwaga. W praktyce Oracle sam zarz ˛

adza blokadami jakie nakładaj ˛

a

działania transakcji.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

25 / 42

background image

Blokady dzielone

Blokada

dzielona

na rekord X pozwala innym transakcjom

odczytywa´c warto´s´c rekordu X.

Blokady dzielone stosuje si ˛e w celu zabezpieczenia odczytanego
rekordu przed zmian ˛

a w czasie działania transakcji, która go

odczytała.

Jeden rekord mo˙ze mie´c zało˙zonych wiele blokad dzielonych.

Transakcja odczytuj ˛

ac rekord X nakłada na niego blokad ˛e

dzielon ˛

a.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

26 / 42

background image

Blokady na wył ˛

aczno´s´c

Je´sli transakcja chce zmieni´c lub usun ˛

a´c rekord X musi nało˙zy´c

na niego blokad ˛e

na wył ˛

aczno´s´c

.

Blokady na wył ˛

aczno´s´c nie mo˙zna zało˙zy´c na rekord, który ma

blokad ˛e dzielon ˛

a.

Jeden rekord mo˙ze mie´c zało˙zon ˛

a tylko jedn ˛

a blokad ˛e na

wył ˛

aczno´s´c.

Blokad ˛e tak ˛

a zakładamy modyfikuj ˛

ac rekord. Przestaje by´c on

widoczny (przy poziomie commited read) a˙z do chwili
zatwierdzenie transakcji.

Zatwierdzenie transakcji zwalnia wszystkie nałozone przez ni ˛

a

blokady.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

27 / 42

background image

Zawieszenie wykonywania transakcji

Nało˙zona blokada mo˙ze spowodowa´c zawieszenie wykonywania
transakcji do czasu zatwierdzenia transakcji, która nało˙zyła
blokad ˛e.

Dlatego trzeba unika´c zakładania blokad (zwłaszcza na
wył ˛

aczno´s´c) w sytuacji interakcji z u˙zytkownikiem.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

28 / 42

background image

Outline

1

Transakcje

Problemy interakcji

2

Metody usuwania konfliktów

Szeregowalno´s´c
Blokady

Zakleszczenia

Misc

3

Transakcje i blokady w BD Oracle

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

29 / 42

background image

Zakleszczenia

Rozwa˙zmy ci ˛

ag interakcji:

T

1

T

2

write(X,1)

write(Y, 2)

write(Y,1)

write(X,2)

Obie transakcje czekaj ˛

a na zwolnienie blokady na wył ˛

aczno´s´c.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

30 / 42

background image

Zakleszczenia – Oracle

W przypadku wykrycia zakleszczenia SZBD Oracle wysyła do
jednej z transakcji komunikat o bł ˛edzie: „ORA–00060: deadlock
detected while waiting for resource”.

Transkacja, która otrzymała komunikat o błedzie ko ´nczy
oczekiwanie i mo˙ze np. wykona´c commit lub rollback.

Druga z transakcji oczekuje dalej na zwolnienie blokady.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

31 / 42

background image

Outline

1

Transakcje

Problemy interakcji

2

Metody usuwania konfliktów

Szeregowalno´s´c
Blokady
Zakleszczenia

Misc

3

Transakcje i blokady w BD Oracle

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

32 / 42

background image

Długie transakcje

Je´sli czas modyfikacji trwa długo (np. modyfikacje programu lub
pliku tekstowego przez u˙zytkownika) to cz ˛esto nie warto zakłada´c
blokady.

Mo˙zna zastosowa´c np. system wypo˙zyczania i zwracania.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

33 / 42

background image

Inne rodzaje blokad

Blokady inkrementacyjne.

Blokady z aktualizacj ˛

a.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

34 / 42

background image

Outline

1

Transakcje

Problemy interakcji

2

Metody usuwania konfliktów

Szeregowalno´s´c
Blokady
Zakleszczenia
Misc

3

Transakcje i blokady w BD Oracle

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

35 / 42

background image

O. traktuje ka˙zd ˛

a instrukcj ˛e SQL jako atomow ˛

a (statement level

atomicity).

Nie mo˙zna aktualizowa´c tylko cz ˛e´sci tabeli.

Wycofanie instrukcji SQL skutkuje tak˙ze wycofaniem skutków
działania wyzwalaczy, które uruchomiła.

Wycofanie instrukcji SQL nie powoduje wycofania całej transakcji.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

36 / 42

background image

Ka˙zda sesja z baz ˛

a danych to jedna transakcja, zako ´nczy´c tak ˛

a

transakcj ˛e mo˙zna przez polecienie commit lub rollback.

Innym sposobem na zako ´nczenie transakcji (jako commit) jest
wydanie polecenia DDL lub zako ´nczenie poł ˛

aczenia z baz ˛

a

danych (disconnect).

Ka˙zda nowa komenda SQL po commit lub instrukcji DDL
rozpoczyna now ˛

a transakcj ˛e.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

37 / 42

background image

Polecenia specyficzne dla Oracle

SET TRANSACTION i SET TRANSACTION NAME <nazwa>,

COMMIT, ROLLBACK,

SAVEPOINT <nazwa>,

ROLLBACK TO SAVEPOINT.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

38 / 42

background image

Rollback to savepoint

Polecenie

rollback to savepoint <nazwa> wycofuje zmiany

wykonane przez transakcj ˛e po zało˙zeniu punktu <nazwa>.

Wszystkie blokady zało˙zone po tym punkcie zostaj ˛

a zwolnione.

Je´sli inna transakcja czekała na zwolnienie blokady ju˙z wcze´sniej,
to nie otrzyma zasobu.

Nowe blokady b ˛ed ˛

a mogły zało˙zy´c tyko transakcje, które za˙z ˛

adaj ˛

a

go po jego zwolnieniu.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

39 / 42

background image

Rollback to savepoint – przykład

Rozwa˙zmy nast ˛epuj ˛

aca interakcj ˛e trzech transakcji na tabeli r(a,b):

T

1

T

2

T

3

...

...

...

savepoint powrot;
update r set a= 1
where b=5;
1 row updated.

update r set a= 2
where b=5;

rollback to s. powrot;

T

2

czeka ...

T

2

czeka ...

update r set a= 3
where b=5;

...

1 row updated.

commit;

...
...

commit

1 row updated.

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

40 / 42

background image

Poziomy izolacji w Oracle

Domy´slnym poziomem izolacji jest

read commited.

Inne poziomy to

serializable oraz read only.

Poziom

read only zapewnia powtarzalno´s´c wyników zapyta ´n,

zabrania modyfikacji bazy danych (set transaction read only).

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

41 / 42

background image

Poziomy izolacji w Oracle

set isolation level [committed read | serializable];

set transaction [read only | read write];

Konrad Zdanowski ( Uniwersytet Kardynała Stefana Wyszy ´nskiego, Warszawa)

Bazy danych – wykład dziewi ˛

aty Transakcje

42 / 42


Document Outline


Wyszukiwarka

Podobne podstrony:
KZ BD w07 id 256666 Nieznany
KZ BD w14 2 id 256670 Nieznany
KZ BD w12 id 256669 Nieznany
KZ BD w03 2 id 256664 Nieznany
KZ BD w11 2 id 256668 Nieznany
bd lab2 id 81995 Nieznany (2)
bd dbastudio id 81961 Nieznany (2)
BD 408e id 130025 Nieznany (2)
bd w1 id 81977 Nieznany (2)
bd lab2 id 81995 Nieznany (2)
bd dbastudio id 81961 Nieznany (2)
BD 2st 1 2 w09 tresc 1 1 id 819 Nieznany (2)
Antropologia kulturowa W09 id 6 Nieznany (2)
BD 1st 2 4 lab3 tresc 1 1 id 81 Nieznany
bd lab 04 id 81967 Nieznany (2)
Calosc BD id 108184 Nieznany
BD 2st 1 2 w13 tresc 1 1 id 819 Nieznany (2)

więcej podobnych podstron