ďťż
 
=?ISO-8859-2?Q?Re:_DB2_-_niesp=F3jne_zapytanie_wg._asktom.oracle.com?= ďťż
 
=?ISO-8859-2?Q?Re:_DB2_-_niesp=F3jne_zapytanie_wg._asktom.oracle.com?=
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

=?ISO-8859-2?Q?Re:_DB2_-_niesp=F3jne_zapytanie_wg._asktom.oracle.com?=



Artur Wronski - 13-01-2007 00:01
=?ISO-8859-2?Q?Re:_DB2_-_niesp=F3jne_zapytanie_wg._asktom.oracle.com?=
  krycek6@wp.pl napisał(a):

>A może ktoś potrafi podważyć opinię Tom'a.

Podważam obiektywność Toma w przedstawieniu tematu.

Zasadniczo są dwie metody kontroli współbieżności dostępu do danych: poprzez
blokady oraz poprzez wersjonowanie rekordów. Jedna i druga metoda ma swoje
wady i zalety. Zapoznaj się z publikacjami, które mówią o negatywnych stronach
wersjonowania danych:

ftp://ftp.software.ibm.com/software/...rs/locking.pdf
ftp://ftp.software.ibm.com/software/...onsistency.pdf

O plusach i minusach obu metod możesz rzeczowo przeczytać tutaj:
http://www.dbazine.com/db2/db2-disarticles/gulutzan6

Wracając do przykładu "there is 1600 in the bank" to interpretacja przykładu
jest bez sensu, ponieważ wybrany poziom izolacji "Read commited" z definicji
(tak jak definiuje to standard ANSI) dopuszcza niepowtarzalność odczytu oraz
fantomy. Spójność da się zagwarantować przy wyższym poziomie izolacji, bądź
poprzez odpowiedni model danych pozwalających na wykonywanie zestawień bez
kosztów blokowania. W przypadku małej liczby rekordów dotykanych przez
zestawienie, wstrzymanie zapisu na kilka milisekund by uzyskać spójny obraz
odczytu nie jest problemem. W przypadku raportowania z dużej ilości danych na
pewno poziom izolacji spójności odczytu jest wartościowy, bo ułatwia (i to
jest dobre określenie) oprogramowanie aplikacji -- choć i tak są z tym
problemy (np. ORA-01555) plus stosunkowo duży koszt wykonywania kopii danych w
trakcie wykonywania zapytania.

Podsumowując: tworzenie aplikacji pod DB2 wymaga innego podejścia niż w
Oracle, i na odwrót.

Pozdrawiam,
artur.wronski@gmail.com

--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/





krycek6@wp.pl - 16-01-2007 00:01

  Witam

> krycek6@wp.pl napisał(a):
> >" db2 [...] returns answers that never existed ever -- eg, it makes up
> > answers"

> >i dalej przykład jak baza DB2 na poziomie izolacji transakcji read
> >commited potrafi (w szczególnym przypadku oczywiście) w trakcie
> >wykonywania zapytania do bazy odczytać dane częściowo zmodyfikowane
> >inną transakcją (która w między czasie wykonała commit) i
> >zwrócić wyniki niespójne i nie mające nic wspólnego z
> >rzeczywistością.

> >http://asktom.oracle.com/pls/asktom/
f?p=100:11:0::::P11_QUESTION_ID:3512484632553#4098 832642632
> >(wątek jest dość długi - warto poszukać hasła "there is 1600 in
> >the bank there right")

> >Pytam zatem użytkowników DB2 - na ile jest to prawda?
>
> >A może ktoś potrafi podważyć opinię Tom'a.
>
> Podważam obiektywność Toma w przedstawieniu tematu.

Czy zatem oznacza to że napisał nieprawdę czy przedstawił fakty prawdziwe, ale
nieobiektywne bo z punktu widzenia konkurencji? Jasne że Tom będzie twierdził
że Oracle jest lepszy od DB2 np w dyskusjach o wyższości blokowania na poziomie
wierszy bądź bloków. Pytanie tylko na ile ten konkretny przypadek opisany przez
niego jest możliwy.

>
> Zasadniczo są dwie metody kontroli współbieżności dostępu do danych: poprzez
> blokady oraz poprzez wersjonowanie rekordów. Jedna i druga metoda ma swoje
> wady i zalety.

To jest dla mnie jasne. Chodzi o to że obydwie metody powinny gwarantować
spełnianie jednoznacznych kryteriów na określonym poziomie izolacji transakcji.

> Zapoznaj się z publikacjami, które mówią o negatywnych stronach
> wersjonowania danych:
>
> ftp://ftp.software.ibm.com/software/...rs/locking.pdf
> ftp://ftp.software.ibm.com/software/...onsistency.pdf
>
> O plusach i minusach obu metod możesz rzeczowo przeczytać tutaj:
> http://www.dbazine.com/db2/db2-disarticles/gulutzan6
>

Za linki dziękuję - na pewno poczytam.

> Wracając do przykładu "there is 1600 in the bank" to interpretacja przykładu
> jest bez sensu, ponieważ wybrany poziom izolacji "Read commited" z definicji
> (tak jak definiuje to standard ANSI) dopuszcza niepowtarzalność odczytu oraz
> fantomy.

Jasne - tylko w przykładzie nie mamy doczynienia ani z jednym ani z drugim. Z
niepowtarzalnością odczytu nie mamy do czynienia gdyż jest wykonywany tylko
jeden. A fantom też nie ma miejsca bo też wymaga dwóch odczytów gdzie pojawią
się nowe wiersze (bądź znikną stare) chyba że ja czegoś nie rozumiem - jeśli
tak proszę o skorygowanie. Zgodnie z moją wiedzą wszelkie zjawiska dotyczą
tranzakcji i dwóch odczytów w jej ramach. Pojedyncze zapytanie zawsze powinno
zwrócić dane spójne, czyli takie które w pewnym momencie w bazie się faktycznie
pojawiły. Nawet na poziomie "read uncommited" żadne z poleceń DML'a nie powinno
"wejść w środek" DQL'a co najwyżej może "wejść między" 2 różne select'y. Może
się mylę ale wydaje mi się to zachowaniem naturalnym.

W tym sensie nie byłbym zdziwiony różnymi wynikami między np. Oracle'm a DB2
jeśli w jednym np. fantom by wystąpił, a w drugim nie (standard nie gwarantuje
wystąpienia negatywnych objawów) w przypadku dwóch róznych odczytów.

Tym co mnie tutaj szokuje to fakt iż zapytanie czyta dane _częściowo_
zmodyfikowane. Tzn - nie tyle tranzakcja jest niespójna co jedno pojedyncze
zapytanie gdyż w połowie czyta bloki niezmienione a w drugiej połowie zmienione.

W dokumentach podesłanych przez Ciebie jest napisane:
"[...]With Oracle, the data you see in any query is the data as it existed at
the start
of that query. This does not conform to any ANSI standard isolation level,
nor is it the way other RDBMSs work[...]"
oraz
"[...]Even committed transactions are not seen by the reader if the reading
statement started before the updating statement.[...]"

Polemizowałbym z tym gdyż standard mówi iż:
"For certain
SQL-statements, the execution context is always atomic. A routine execution
context is either
atomic or non-atomic. Every trigger execution context is atomic."
oraz
"The execution of all SQL-statements other than SQL-control statements is
atomic with respect to
recovery. Such an SQL-statement is called an atomic SQL-statement."

> Spójność da się zagwarantować przy wyższym poziomie izolacji, bądź
> poprzez odpowiedni model danych pozwalających na wykonywanie zestawień bez
> kosztów blokowania. W przypadku małej liczby rekordów dotykanych przez
> zestawienie, wstrzymanie zapisu na kilka milisekund by uzyskać spójny obraz
> odczytu nie jest problemem. W przypadku raportowania z dużej ilości danych na
> pewno poziom izolacji spójności odczytu jest wartościowy, bo ułatwia (i to
> jest dobre określenie) oprogramowanie aplikacji -- choć i tak są z tym
> problemy (np. ORA-01555) plus stosunkowo duży koszt wykonywania kopii danych w
> trakcie wykonywania zapytania.

Wszystko to zgoda i zgadzam się że gwarancja spójności na określonym poziomie
wymaga czasem poświęceń niezależnie od wewnętrznego sposobu w jaki obsługiwana
jest wielodostępowość (concurency) - np. oracle pójdzie dalej a DB2 zawiśnie na
lock'u. Albo DB2 skończy a Oracle rzuci ORA. W tym sensie jak najbardziej się
zgadzam.

>
> Podsumowując: tworzenie aplikacji pod DB2 wymaga innego podejścia niż *w
> Oracle, i na odwrót.

W ogólnym przypadku zgoda - zwłaszcza jeśli chodzi o blokady. Pytanie jednak o
zapytanie podane w przykładzie i toi czy wykonanie powinno być atomowe, a wynik
spójny pozostaje otwarte.

>
> Pozdrawiam,
> artur.wronski@gmail.com
>

Również pozdrawiam
Przemysław Kantyka

--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl




Artur - 16-01-2007 00:01
=?iso-8859-2?q?Re:_DB2_-_niesp=F3jne_zapytanie_wg._asktom.oracle.com?=
  Przemek,

> > racając do przykładu "there is 1600 in the bank" to interpretacja przykładu
> > jest bez sensu, ponieważ wybrany poziom izolacji "Read commited" z definicji
> > (tak jak definiuje to standard ANSI) dopuszcza niepowtarzalność odczytu oraz
> > fantomy.
>
> Jasne - tylko w przykładzie nie mamy doczynienia ani z jednym ani z drugim. Z
> niepowtarzalnością odczytu nie mamy do czynienia gdyż jest wykonywany tylko
> jeden. A fantom też nie ma miejsca bo też wymaga dwóch odczytów gdzie pojawią
> się nowe wiersze (bądź znikną stare) chyba że ja czegoś nie rozumiem - jeśli
> tak proszę o skorygowanie. Zgodnie z moją wiedzą wszelkie zjawiska dotyczą
> tranzakcji i dwóch odczytów w jej ramach. Pojedyncze zapytanie zawszepowinno
> zwrócić dane spójne, czyli takie które w pewnym momencie w bazie się faktycznie
> pojawiły. Nawet na poziomie "read uncommited" żadne z poleceń DML'anie powinno
> "wejść w środek" DQL'a co najwyżej może "wejść między" 2 różne select'y. Może
> się mylę ale wydaje mi się to zachowaniem naturalnym.

Obstaję przy tym, co napisałem wcześniej. Tak naprawdę jest to
tylko kwestia zrozumienia poziomów izolacji ANSI:

Jeśli wybierzesz read uncommited, to w zapytaniu czytasz wszystko jak
leci, bez sprawdzania blokad. Innymi słowy spójność, w rozumieniu
zatwierdzonego zestawu danych nie jest gwarantowana nawet na poziomie
przetwarzanego rekordu. Zapytanie, które pracuje w tym poziomie
izolacji odczytuje rekordy zatwierdzone oraz niezatwierdzone.

Jeśli wybierzesz read committed, wtedy masz gwarancję, że odczytasz
tylko zatwierdzone rekordy -- blokada jest zakładana tylko na
aktualnie przetwarzanym przez zapytanie rekordzie. W takcie
przetwarzania zapytania przy przejściu do następnego rekordu blokada
jest zwalniana i zakładana na następnym rekordzie. Z definicji w
przypadku tego poziomu izolacji wcale nie masz gwarancji, że odczytany
przez zapytanie zestaw danych jest spójny w sensie określonych reguł
agregacji zbioru wynikowego -- zawsze inny użytkownik może w
międzyczasie zmodyfikować rekordy, które zostały już przez
zapytanie przetworzone albo będą dopiero przetworzone.

Jeśli wybierzesz poziom repetable read, wtedy każdy już przetworzony
przez zapytanie rekord zostanie zabezpieczony blokadą przed zapisem.
Ten poziom izolacji powoduje, że czytasz tylko rekordy zatwierdzone a
inni użytkownicy nie mogą już zmienić tego, co odczytałeś. To
zapewnia, że odczytane rekordy będą spójne w sensie wykonywanych
przez Ciebie agregacji (nikt nie będzie mógł zmodyfikować tego, co
odczytałeś a potem zmodyfikować to co pozostało do odczytania).
Oczywiście w tym poziomie izolacji ktoś może zmodyfikować rekordy,
które jeszcze nie zostały przetworzone przez zapytanie, np.
przeczytałeś dopiero pierwszy rekord, a ktoś inny modyfikuje i
zatwierdza ostatni rekord. W następnym poziomie izolacji, czyli
serializable nie dość, że zabezpieczasz się przed modyfikacją
tego, co odczytałeś to dodatkowo baza zabezpiecza przez modyfikacją
rekordów, które dopiero odczytasz. Jeśli inny użytkownik będzie
chciał zmodyfikować rekord, który pasuje do twojego zbioru
wynikowego, wtedy taki użytkownik zostanie ustawiony w kolejce i
będzie musiał czekać, aż zapytanie o tym poziomie izolacji zostanie
przetworzone.

Podsumowując: to poziomy izolacji w implementacji ANSI decydują o
spójności zapytań (jednego bądź wielu w transakcji). W
przykładzie Toma spójność zapytania definiowana jest jako suma
wartości odczytanych z wielu rekordów, więc należało wykorzystać
poziom izolacji ansi repetable read. To co nie podoba mi się w
sposobie przedstawienia tematu przez Toma, to budowanie wrażenia, że
jakoby DB2 w jakiś specyficzny, właściwy tylko sobie sposób
zapewnia spójność zapytań. DB2 implementuje poziomy izolacji ansi i
nie jest jedyną bazą na rynku, która tak działa. Tom w przykładzie
mógł także wykorzystać poziom read uncommited, a potem zadziwiać
czytelników, że udało mu się odczytać bieżącą, niezatwierdzoną
wartość -- czego oczywiście w Oracle zrobić się nie da.

Jak wspomniałem w poprzedniej wiadomości w praktyce bardzo często
odpowiednio modeluje się dane, tak by można było wykonywać spójne
agregacje bez konieczności blokowania. Zwróć uwagę, że pobranie
danej kwoty z konta, nigdy nie jest wykonywane po stronie bazy danych
jako pojedynczy update, tak jak to przedstawił Tom. Np. odkładana
jest historia operacji, pozwalająca na odpowiednie aplikacyjne
wersjonowanie danych.

Mam nadzieję, że trochę wyjaśniłem. Pozdrawiam,
Artur Wronski




krycek6@wp.pl - 17-01-2007 00:05

 
> Podsumowując: to poziomy izolacji w implementacji ANSI decydują o
> spójności zapytań (_jednego_ bądź wielu w transakcji). W
> przykładzie Toma spójność zapytania definiowana jest jako suma
> wartości odczytanych z wielu rekordów, więc należało wykorzystać
> poziom izolacji ansi repetable read.

Dziękuję za poświęcony czas i obszerne przypomnienie tematu. Nic poza
podkreślonym wyrazem w wypowiedzi nie było mi w sumie obce. Zawsze jednak
odnosiłem tą wiedzę do transakcji rozumianej jako seria zapytań SQL'a, a nie
seria odczytów pojedynczych krotek. Generalnie wnioski jakie wysuwam z Twojej
wypowiedzi to to że:
- Oracle gwarantuje spójność zapytań agregujących na dowolnym poziomie izolacji
wspieranym przez tą bazę ze względu na mechanizm MVCC i odczytywanie stanu z
bazy na moment startu zapytania. W przypadku wielu zapytań oczywiście problem
poziomu izolacji zostaje otwarty.
- DB2 ze względu na inne rozwiązanie wielodostępu tego nie gwarantuje, bez
odpowiedniego ustawienia poziomu izolacji.

Moje wątpliwości jednak (już teraz czysto akademickie) dotyczą zgodności obu
tych podejść ze standardem SQL'a. Mianowicie w opisie fenomenów jake mogą
wystąpić na poszczególnych poziomach transakcji standard mówi o odczycie i
zapisie rekordów w poszczególnych transakcjach (a nie wykonaniu pojedynczych
zapytań). Oznacza to iż podejście DB2 jest z tym zgodne, a podejście Oracle'a
nie - bo np. w trybie read commited Oracle nie odczyta już zatwierdzonego
rekordu jeśli zapytanie rozpoczeło się wcześniej (chociaż konkretny wiersz
został przeczytany później). I to miał na myśli jeden z dokumentów podesłanych
mi przez Ciebie w linkach mówiąc "[...]With Oracle, the data you see in any
query is the data as it existed at the start of that query. This does not
conform to any ANSI standard isolation level, nor is it the way other RDBMSs
work[...]". Dobrze rozumiem?

Tu muszę zaznaczyć, że wspomniana przeze mnie w poprzednim poście kwestia
atomiczności zapytań (atomicity), która pojawia się w standardzie SQL99
("4.30.4 SQL-statement atomicity") dotyczy modyfikacji danych w ramach
odpowiedniego kontekstu oraz zachowania w przypadku przerwania takiego
kontekstu, a nie czytania danych w tym kontekście.

> To co nie podoba mi się w
> sposobie przedstawienia tematu przez Toma, to budowanie wrażenia, że
> jakoby DB2 w jakiś specyficzny, właściwy tylko sobie sposób
> zapewnia spójność zapytań.

Nie no - jasne że Tom jest stronniczy i nie twierdzę że jest inaczej - w końcu
pracuje dla Oracle'a. Podobnie Ktoś pracujący dla IBM będzie mówił że DB2 jest
lepsze, co nie jest oczywiście niczym złym (o ile jakoś odnosi się do
rzeczywistości). Mnie bardziej chodzi o ustalenie faktów niż politykę i
marketing.

Zachowanie przedstawione przez Tom'a DB2 wydawało mi się nieintuicyjne (ze
względu na długie przyzwyczajenie do Oracle'a) i chciałem dowiedzieć się z
czego wynika.

> DB2 implementuje poziomy izolacji ansi i
> nie jest jedyną bazą na rynku, która tak działa.

Ale Oracle też nie jest sam. Podobnie działa np. PostgreSQL z tego co się
orientuję ale to już inna kwestia.

>
> Jak wspomniałem w poprzedniej wiadomości w praktyce bardzo często
> odpowiednio modeluje się dane, tak by można było wykonywać spójne
> agregacje bez konieczności blokowania.

To zdanie jest bardzo ciekawe i interesujące. Jeśli mógłbym prosić o jakieś
materiały w zakresie przemodelowywania struktury bazy gwarantujące uzyskanie
spójnych wyników zapytań agregujących bez konieczności blokowania to będę
wdzięczny.

> Zwróć uwagę, że pobranie
> danej kwoty z konta, nigdy nie jest wykonywane po stronie bazy danych
> jako pojedynczy update, tak jak to przedstawił Tom. Np. odkładana
> jest historia operacji, pozwalająca na odpowiednie aplikacyjne
> wersjonowanie danych.

No nie da się ukryć że przykład Tom'a był uproszczony.

> Mam nadzieję, że trochę wyjaśniłem. Pozdrawiam,
> Artur Wronski

Jak najbardziej.
Dziękuję za poświęcony czas i również pozdrawiam.

Przemysław Kantyka

--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    Oracle 19g +Insert +Insert +Insert... Wydajność baz danych w zależności od poziomu izolacji ANSI/ISO MSSQL Express czy Oracle Express Czy zna (obsługuje) ktoś program Iso Draw ? MYSQL - kodowanie w ISO-PL strona plus baza w iso do utf-8 Kodowanie: z iso na utf [Oracle, Toad] Zaladowanie obiektu w TOAD [Oracle][Reports30] 10G nie dziala razem z Reports3.0 [Oracle] catalog.sql i catproc.sql - bledy
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • ptsite.xlx.pl
  • Cytat

    Decede mihi sole - nie zasłaniaj mi słonca.
    Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści
    Hoc fac - tak czyń.
    A tergo - od tyłu; z tyłu.
    I czarne włosy posiwieją. Safona

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com