PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Anomalia zapisu Skew w Oracle i PostgreSQL nie wycofuje transakcji

W artykule z 1995 r. Krytyka poziomów izolacji ANSI SQL , Jim Gray i spółka, opisali Phantom Read jako:

Dlatego odczyt fantomowy nie oznacza, że ​​możesz po prostu zwrócić migawkę z początku bieżącej transakcji i udawać, że dostarczenie tego samego wyniku dla zapytania ochroni cię przed faktyczną anomalią odczytu fantomowego.

W oryginalnej implementacji SQL Server 2PL (Two-Phase Locking) zwracanie tego samego wyniku dla kwerendy implikowanej Predicate Locks.

Izolacja migawek MVCC (Multi-Version Concurrency Control) (błędnie nazwana Serializable w Oracle) w rzeczywistości nie uniemożliwia innym transakcjom wstawiania/usuwania wierszy spełniających te same kryteria filtrowania z zapytaniem, które zostało już wykonane i zwróciło zestaw wyników w naszym bieżącym uruchomieniu transakcja.

Z tego powodu możemy sobie wyobrazić następujący scenariusz, w którym chcemy zastosować podwyżkę dla wszystkich pracowników:

  1. Tx1:SELECT SUM(salary) FROM employee where company_id = 1;
  2. Tx2:INSERT INTO employee (id, name, company_id, salary) VALUES (100, 'John Doe', 1, 100000);
  3. Tx1:UPDATE employee SET salary = salary * 1.1;
  4. Tx2:COMMIT;
  5. Tx1:COMMIT:

W tym scenariuszu CEO przeprowadza pierwszą transakcję (Tx1), więc:

  1. Najpierw sprawdza sumę wszystkich wynagrodzeń w swojej firmie.
  2. Tymczasem dział HR przeprowadza drugą transakcję (Tx2), ponieważ właśnie udało im się zatrudnić Johna Doe i dać mu pensję w wysokości 100 000 USD.
  3. Dyrektor generalny decyduje, że podwyżka o 10% jest możliwa, biorąc pod uwagę całkowitą sumę wynagrodzeń, nie wiedząc, że suma wynagrodzeń wzrosła o 100 tys.
  4. Tymczasem transakcja HR Tx2 jest zatwierdzona.
  5. Tx1 jest zadeklarowany.

Bum! Dyrektor generalny podjął decyzję w sprawie starej migawki, dając podwyżkę, która może nie zostać utrzymana przy obecnym zaktualizowanym budżecie wynagrodzeń.

Możesz zobaczyć szczegółowe wyjaśnienie tego przypadku użycia (z dużą ilością diagramów) w następującym poście .

Czy to jest odczyt widmowy, czy Pochylenie zapisu ?

Według Jim Gray i współ , jest to odczyt widmowy, ponieważ pochylenie zapisu jest zdefiniowane jako:

W Oracle Menedżer transakcji może, ale nie musi, wykryć powyższą anomalię, ponieważ nie używa blokad predykatów lub Blokady zakresu indeksu (blokady następnego klawisza) , jak MySQL.

PostgreSQL udaje się wyłapać tę anomalię tylko wtedy, gdy Bob wykona odczyt tabeli pracowników, w przeciwnym razie zjawisko to nie zostanie powstrzymane.

AKTUALIZACJA

Początkowo zakładałem, że Serializability będzie również oznaczać zamawianie czasu. Jednak, jak bardzo dobrze wyjaśnił Peter Bailis , zamawianie zegara ściennego lub linearyzacja są zakładane tylko dla ścisłej serializacji.

Dlatego moje założenia zostały poczynione dla systemu Strict Serializable. Ale nie to ma oferować Serializable. Model izolacji z możliwością serializacji nie daje żadnych gwarancji dotyczących czasu, a operacje można zmieniać, o ile są równoważne z niektórymi seryjne wykonanie.

Dlatego, zgodnie z definicją Serializable, taki Phantom Read może wystąpić, jeśli druga transakcja nie spowoduje żadnego odczytu. Ale w modelu Strict Serializable, oferowanym przez 2PL, Phantom Read byłby uniemożliwiony, nawet jeśli druga transakcja nie spowoduje odczytu dla tych samych wpisów, które staramy się chronić przed fantomowymi odczytami.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. postgresql łączenie kilku okresów w jeden

  2. dołącz do dwóch różnych tabel i usuń zduplikowane wpisy

  3. Audyt PostgreSQL za pomocą pgAudit

  4. Jaki jest właściwy indeks do odpytywania struktur w tablicach w jsonb Postgresa?

  5. Znajdź n najbliższych sąsiadów dla danego punktu za pomocą PostGIS?