sql - Jaki jest najlepszy domyślny poziom izolacji transakcji dla ERP?

Translate

Krótkie tło: Dopiero zaczynamy migrować / reimplementować system ERP do Java z Hibernate, mając na celu liczbę 50-100 użytkowników korzystających jednocześnie z systemu. Używamy MS SQL Server jako serwera bazy danych, który jest wystarczająco dobry do tego obciążenia.

Obecnie stary system w ogóle nie wykorzystuje żadnych transakcji i w przypadku części krytycznych (np. Zmian zapasów) polega na ustawianiu ręcznych blokad (za pomocą flag) i ich zwalnianiu. To coś w rodzaju ręcznego zarządzania transakcjami. Ale czasami występują problemy z niespójnością danych. W nowym systemie chcielibyśmy wykorzystać transakcje do wyeliminowania tych problemów.

Teraz pytanie: co byłoby dobre / rozsądnedomyślnapoziom izolacji transakcji do użycia w systemie ERP, biorąc pod uwagę użycie około 85% OLTP i 15% OLAP? Czy też powinienem zawsze decydować na podstawie zadania, którego poziomu transakcji użyć?

I dla przypomnienia cztery poziomy izolacji transakcji: CZYTAJ NIEZGODNIONY, CZYTAJ ZOBOWIĄZANY, POWTARZALNY ODCZYT, SERIALIZOWALNY

This question and all comments follow the "Attribution Required."

Wszystkie odpowiedzi

Translate

99 razy na 100, odczyt popełniony jest właściwą odpowiedzią. Gwarantuje to, że zobaczysz tylko zmiany, które zostały zatwierdzone przez inną sesję (a tym samym wyniki, które są spójne, zakładając, że poprawnie zaprojektowałeś swoje transakcje). Ale nie narzuca narzutu blokowania (szczególnie w bazach danych innych niż Oracle), który nakłada powtarzalny odczyt lub możliwość serializacji.

W bardzo rzadkich przypadkach możesz chcieć wygenerować raport, w którym chcesz poświęcić dokładność na rzecz szybkości i ustawić poziom izolacji niezatwierdzonego odczytu. Rzadko jest to dobry pomysł, ale czasami jest to rozsądnie akceptowalne obejście problemu blokowania rywalizacji.

Odczyty, które można serializować i powtarzalne, są czasami używane, gdy istnieje proces, który musi widzieć spójny zestaw danych w całym przebiegu, niezależnie od tego, jakie inne transakcje są wykonywane w tym czasie. Może być właściwe ustawienie procesu uzgadniania na koniec miesiąca tak, aby był możliwy do serializacji, na przykład, jeśli jest dużo kodu proceduralnego, możliwość, że użytkownicy będą wprowadzać zmiany w trakcie działania procesu i wymaganie, aby proces upewnij się, że zawsze widzi dane w stanie, w jakim istniały w momencie rozpoczęcia uzgadniania.

Źródło
Translate

Nie zapomnij o SNAPSHOT, który znajduje się tuż pod SERIALIZABLE.

Zależy to od tego, jak ważne jest, aby dane w raportach były dokładne. To naprawdę kwestia zadania po zadaniu.

Źródło
Translate

To naprawdę zależy w dużej mierze od tego, jak zaprojektujesz swoją aplikację, prostą odpowiedzią jest po prostu READ_COMMITTED.

Możesz argumentować, że jeśli projektujesz swój system z myślą o tym, możesz użyć READ_UNCOMMITTED jako domyślnego i podnieść poziom izolacji tylko wtedy, gdy tego potrzebujesz. Zdecydowana większość transakcji i tak się powiedzie, więc odczyt niezatwierdzonych danych nie będzie wielkim problemem.

Sposób, w jaki poziomy izolacji wpływają na zapytania, zależy od docelowej bazy danych. Na przykład bazy danych, takie jak Sybase i MSSQL, muszą blokować więcej zasobów podczas uruchamiania READ_COMMITTED, niż bazy danych takie jak Oracle.

Źródło
Translate

W przypadku SQL Server (i prawdopodobnie większości głównych RDBMS) trzymałbym się wartości domyślnej. W przypadku programu SQL Server jest to ZOBOWIĄZANE ODCZYT. Cokolwiek więcej i zaczynasz przeciążać DB, cokolwiek mniej i masz problemy ze spójnością.

Źródło
Translate

Read Uncommitted jest zdecydowanie słabszym graczem na większości forów. Istnieją jednak powody, dla których warto go używać, wykraczające poza często wskazywaną kwestię „szybkości w porównaniu z dokładnością”.

Powiedzmy, że masz:

  • Transakcja T1: zapisuje B, odczytuje A, (trochę więcej pracy), zatwierdza.
  • Transakcja T2: zapisuje A, odczytuje B (trochę więcej pracy), zatwierdza.

Po zatwierdzeniu odczytu powyższe transakcje nie zostaną zwolnione do momentu zatwierdzenia. Następnie możesz spotkać się z sytuacją, w której T1 czeka, aż T2 zwolni A, a T2 czeka, aż T1 zwolni B. Tutaj dwie transakcje zderzają się w zamku.

Możesz ponownie napisać te procedury, aby uniknąć tego scenariusza (przykład: pozyskuj zasoby zawsze w kolejności alfabetycznej!). Mimo to przy zbyt wielu jednoczesnych użytkownikach i dziesiątkach tysięcy wierszy kodu problem ten może stać się zarówno bardzo prawdopodobny, jak i bardzo trudny do zdiagnozowania i rozwiązania.

Alternatywą jest użycie opcji Czytaj niezatwierdzone. Następnie projektujesz transakcje, zakładając, że mogą wystąpić brudne odczyty. Osobiście uważam, że ten problem jest znacznie bardziej zlokalizowany i uleczalny niż wraki pociągów.

Problemy z brudnymi odczytami mogą zostać wyeliminowane przez

  • (1) Wycofania: nie. Powinna to być ostatnia linia obrony tylko w przypadku awarii sprzętu, awarii sieci lub awarii programu.

  • (2) Użyj blokad aplikacji, aby utworzyć mechanizm blokujący działający na wyższym poziomie abstrakcji, gdzie każda blokada jest bliższa rzeczywistemu zasobowi lub działaniu.

Źródło
Leave a Reply
You must be logged in to post a answer.
O autorze