Wpis z mikrobloga

#plsql #sql #oracle

Hej,

Mam pewien problem ze zrozumieniem izolacji w transakcjach. Tak jak rozumiem READ COMMITED i READ-ONLY, to nie za bardzo rozumiem SERIALIZABLE.

Tutaj tak w skrócie:

READ COMMITED – (domyślny Oracle). Kwerendy w transakcji pokazują tylko zatwierdzone dane.

SERIALIZABLE – Kwerendy w transakcji pokazują tylko te zmiany w danych, które zostały zatwierdzone przed transakcją i te których dokonała sama transakcja.

READ-ONLY - najczęściej stosuje się ten poziom izolacji w systemach raportowych.

Ustawiajać poziom izolacji transakcji na READ-ONLY uzyskujemy „widok na dane” w czasie zaczęcia tranzakcji i ten widok się nie zmienia nawet jesli inna transakcja poprawnie zakończona (zatwierdzona!) zmieni te dane.

Wedle tego to jeśli mamy tabelkę A:

id Imię Nazwisko

1 Jan Nowak

2 Marian Kowalski

to mamy potem wynik z select * from A;

1 Jan Nowak

2 Marian Kowalski

No i jak włączymy transakcje tego typu:

set transaction isolation level serializable;

update A

set Imię = 'Ziutek'

where id = 1;

Bez COMMIT

czyli po transakcja działa już na danych

1 Ziutek Nowak

2 Marian Kowalski

Ale jakby ktoś inny zrobił SELECT to jest

1 Jan Nowak

2 Marian Kowalski

A potem dał INSERT, czyli miałby tabelkę

1 Jan Nowak

2 Marian Kowalski

3 Marta Nowakowska

To ja w transakcji nie widzę tego trzeciego rekordu z tego co rozumiem.

Ale daję COMMIT i teraz co ja zobaczę? Czy to:

1 Ziutek Nowak

2 Marian Kowalski

Czy to:

1 Ziutek Nowak

2 Marian Kowalski

3 Marta Nowakowska

Czy jeszcze coś innego?

Nie mam teraz jak tego sprawdzić, bo siedzę w robocie, a tu nie mam Oracla :P

No i może ja nie rozumiem tego tak do końca i transakcja to działa dalej po COMMIT? i użytkownik, który ją wywołał cały czas widzi dane sprzed transakcji i te które sam zmodyfikował?
  • 2