# TRANSAKCJE, BLOKADY, ZAKLESZCZENIA

### Trochę teorii:

TRANSAKCJA - jest to akcja przeprowadzana na bazie danych związana z modyfikowaniem danych.

Cechy transakcji:

- NIEPODZELNOŚĆ - w przypadku gdy transakcja sklada się z kilku akcji (zapytania, tworzenie tabel, itp..) i któraś "akacja" nie będzie mogła być wykonana wówczas transakcja nie powinna być wykonana jako całość,
- SPÓJNOŚC - transakcja powinna zostawić bazę w takim stanie w jakim się rozpoczęła, (normalny stan bazy danych nazywany jest spójnym , czyli takim, że dane nie ulegną zniszczeniu lub znieksztalceniu),
- WSPÓŁBIEŻNOŚĆ - pozwala na pracę wielu użytkownikom w tym samym czasie bez nakładania się danych i występowania kolizji danych
- IZOLOWALNOŚC - BD musi blokować dane w momencie trwania transakcji w celu uniemożliwienia wykonywania na nich operacji przez inne transakcje,
- TRWAŁOŚC - oznacza, że po wykonaniu transakcji dane powinny być zabezpieczone przed utratą, która może miećv miejsce w momencie wystąpienia awarii.

Typowy przebieg transakcji:

1. Rozpoczęcie transakcji

2. Zapis tymczasowy danych

3. Sprawdzenie spójności danych

4. Utrwalenie lub wycofanie zmian

Transakcje rozpoczyna się słowem BEGIN (rozpocznij), a kończy słowem COMMIT (potwierdź).

### Przykład:

Tworzymy tabelę:

CREATE TABLE osoby (
osoby_id SERIAL PRIMARY KEY,
imie VARCHAR(15),
nazwisko VARCHAR(20),
wiek INT(3) );

Wypełniamy tabelę danymi:

INSERT INTO osoby(imie, nazwisko, wiek) VALUES ('Jan','Nowak','23');

INSERT INTO osoby(imie, nazwisko, wiek) VALUES ('Jacek','Marszelik','47');

INSERT INTO osoby(imie, nazwisko, wiek) VALUES ('Janina','Graj','33');

INSERT INTO osoby(imie, nazwisko, wiek) VALUES ('Adam','Nowy','65');

INSERT INTO osoby(imie, nazwisko, wiek) VALUES ('Katarzyna','Kowalska','17');

Uzyskany efekt (tabela osoby)

Modyfikujemy tabelę poleceniem:
BEGIN;
UPDATE osoby SET wiek = 18 WHERE osoby_id > 2;

Usykujemy efekt w postaci informacji:

Cofnięcie zmian można dokonać zapytaniem: ROLLBACK;

Jeżeli chcemy mieć wływ na zmianę danych można utworzyć punkty przywracania za pomocą polecenia: SAVEPOINT

Kod zapytań może wyglądać np. tak:
BEGIN;
UPDATE osoby SET wiek = 18 WHERE osoby_id > 5;
SAVEPOINT point_1;
UPDATE osoby SET wiek = 18 WHERE osoby_id > 4;
SAVEPOINT point_2;
UPDATE osoby SET wiek = 18 WHERE osoby_id > 3;
SAVEPOINT point_3;

Tworzymy w ten sposób 3 punkty przywracania do których możemy wrócić cofając zmiany.

Usykujemy efekt w postaci informacji:

Cofnijmy zmiany do 2 punktu przywracania za pomocą polecenia:
RELEASE SAVEPOINT point_2;

### BLOKADY i ZAKLESZCZENIA

Blokady i zakleszczenia są prawidłowością przy dobrze zaprojektowanej bazie danych.

BLOKADA występuje wówczas, gdy jedna transakcja jest w trakcie wykonywania swoich zapytań na bazie danych.

ZAKLESZCZENIE występuje wówczas, gdy co najmniej dwie transakcje czekają na wykonanie swoich zapytań i obie nakładają blokadę na siebie.

⇒ Spis treści ⇐

⇐ PREV NEXT ⇒