2013-08-18 9 views
13

Z this oracle poradniku JAVA:Różnica jednorazowych odczytu vs brudny odczytu

Non powtarzalny odczytu zachodzi podczas transakcji a odczytuje wiersz, transakcji B następnie aktualizuje wiersz, a transakcja Późniejsza ponownie pobiera ten sam wiersz. Transakcja A powoduje dwukrotne pobranie tego samego wiersza , ale widzi inne dane.

Jaka jest różnica między brudnym czytaniem a nieodczytywalnym odczytem? Czy to nie to samo? Czytanie błędnego wyniku z powodu aktualizacji innych osób?

Z góry dziękuję.

Odpowiedz

14

Dokładna sama strona wyjaśnia, co brudne odczytu jest:

Dostęp zaktualizowaną wartość, która nie został popełniony jest uważany za brudny odczyt ponieważ możliwe jest, że wartość być przywracana do swojej poprzedniej wartości . Jeśli odczytasz wartość, która zostanie później wycofana, odczytana zostanie niepoprawna wartość.

Czytanie nieodtwarzalne polega na czytaniu dwóch różnych wartości zatwierdzonych, podczas gdy odczyty nieczytelne polegają na wczytaniu wartości, która nie została jeszcze zatwierdzona. Trochę inny.

+0

Jak to może być możliwe? Chodzi mi o to, że po zakończeniu transakcji jedynym sposobem na uniknięcie nie powtarzalnych odczytów jest utrzymanie blokady nawet po popełnieniu ... W każdym razie prędzej czy później nastąpi inne połączenie (B) i jak to się stanie, aby zapobiec aktualizacji tego wiersz wcześniej pobrany przez A – Rollerball

+0

A może tylko 1 połączenie na czas może pisać w DBMS. Dopóki istnieje aktywne połączenie z DBMS, żadne inne połączenie nie może faktycznie zaktualizować DB dla tych konkretnych wierszy (dopóki pierwsze połączenie nie zostanie zamknięte) Czy mam rację? – Rollerball

+1

Powtarzalny odczyt jest gwarantowany tylko na czas trwania transakcji: rozpoczyna się transakcja T1, odczytuje A1, następnie inna transakcja T2 modyfikuje A1 na A2 i zatwierdza, wtedy pierwsza transakcja T1 ponownie odczytuje wartość i nadal odczytuje A1 . To jest powtarzalne czytanie. Oczywiście kolejna transakcja T3, która odczytuje wartość po raz pierwszy po zatwierdzeniu T2, odczyta zatwierdzoną wartość, A2. Aby dowiedzieć się, w jaki sposób jest ona zaimplementowana w bazie danych, przeczytaj jego dokumentację. Większość z nich używa [MVCC] (http://en.wikipedia.org/wiki/Multiversion_concurrency_control), AFAIK. –

11

Od here: -

Brudny Czyta wystąpić, gdy jedna transakcja odczytuje dane zapisane przez inny, niezakończonej, transakcję. Niebezpieczeństwo z brudnymi odczytami polega na tym, że inna transakcja może nigdy nie zostać zatwierdzona, pozostawiając oryginalną transakcję z "brudnymi" danymi.

dla Powtarzalne Czyta wystąpić, gdy jedna transakcja próbuje uzyskać dostęp do same dane dwa razy i druga transakcja modyfikuje danych między pierwsza transakcja Przeczytajmy prób. Może to spowodować, że pierwsza transakcja odczyta dwie różne wartości dla tych samych danych, powodując, że oryginalny odczyt będzie nieodwracalny.

+0

Jak to jednak możliwe? Chodzi mi o to, że po zakończeniu transakcji jedynym sposobem na uniknięcie nie powtarzalnych odczytów jest utrzymanie blokady nawet po popełnieniu ...W każdym razie prędzej czy później zrobi się inne połączenie (B) i jak to ma zapobiec aktualizacji tego wiersza poprzednio pobranego przez A – Rollerball

+0

A może tylko 1 połączenie na czas może zapisywać w DBMS. Dopóki istnieje aktywne połączenie z DBMS, żadne inne połączenie nie może faktycznie zaktualizować DB dla tych konkretnych wierszy (dopóki pierwsze połączenie nie zostanie zamknięte) Czy mam rację? – Rollerball

+0

Nieodwracalny odczyt to sytuacja, w której jedna transakcja nie może odczytać za drugim razem, chyba że inna transakcja zmieni wiersz. Podczas wykonywania polecenia wyboru, nieodwracalne odczyty moje wystąpią, gdy nie zostaną uzyskane blokady odczytu. Nieodwracalne odczyty mogą wystąpić przy potrzebie dokonanej transakcji w wyniku konfliktu commit, a wycofanie jest rozluźnione. –