Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Obsługa współbieżnych aktualizacji w trybie hibernacji

Czy ktoś może mi wyjaśnić, czy używamy wiosny do zarządzania transakcjami, jak współbieżne aktualizacje będą obsługiwane przez hibernację (automatyczne zarządzanie wersjami hibernacji w pamięci) czy też muszę umieścić kolumnę wersji w bazie danych, aby ręcznie obsługiwać współbieżne aktualizacje.

To, czy używasz Springa do zarządzania transakcjami, czy nie, nie ma tak naprawdę znaczenia i nie ma znaczenia, jeśli chodzi o zarządzanie współbieżnością, w rzeczywistości jest to obsługiwane przez Hibernate. Hibernate może używać 2 strategii do obsługi równoległych aktualizacji:blokowania optymistycznego i blokowania pesymistycznego.

Optymistyczny

Używając blokowania optymistycznego, mapujesz specjalny atrybut (liczbę, znacznik czasu) jako wersję (więc faktycznie masz na to kolumnę). Ta wersja jest odczytywana po pobraniu jednostki i uwzględniona w klauzuli WHERE podczas aktualizacji i zwiększona przez Hibernację.

Aby zilustrować, jak to działa, wyobraźmy sobie, że ładujesz encję Person przez id=1 i z bieżącą wersją=1. Po zapisaniu Hibernate wykona coś takiego:

update PERSON set ID=1, NAME='NAME 1', VERSION=2 where ID=1 and VERSION=1;

A teraz wyobraź sobie, że masz uruchomione dwie równoległe transakcje, z których każda ładuje takie same podmiot (ten sam numer wersji) i zmiana nazwy.

Załóżmy, że transakcja nr 1 zostaje zatwierdzona jako pierwsza, wykonywane jest następujące zapytanie:

update PERSON set ID=1, NAME='NAME 1', VERSION=2 where ID=1 and VERSION=1;

Uda się, a wersja zostanie zwiększona.

Następnie transakcja nr 2 zostaje zatwierdzona, wykonywane jest następujące zapytanie:

update PERSON set ID=1, NAME='NAME 2', VERSION=2 where ID=1 and VERSION=1;

Ten nie zaktualizuje niczego, ponieważ klauzula where nie pasuje do żadnego rekordu. W tym miejscu otrzymasz optymistyczny wyjątek współbieżności.

Ta strategia jest odpowiednia, gdy nie utrzymujesz połączenia, gdy współbieżne dostępy nie są częste i bardzo dobrze skaluje się. I wszystko jest oczywiście obsługiwane przez Hibernate dla Ciebie, o ile zmapujesz atrybut wersji.

pesymistyczny

Używając blokowania pesymistycznego, Hibernate blokuje rekord do wyłącznego użytku, dopóki go nie skończysz (zazwyczaj używając SELECT ... FOR UPDATE ). Każda inna równoczesna transakcja próbująca uzyskać dostęp do tego samego rekordu zostanie zawieszona do czasu usunięcia blokady. Ta strategia zapewnia lepszą przewidywalność kosztem wydajności i nie skaluje się w nieskończoność.

Referencje

  • Przewodnik dotyczący rdzenia hibernacji
    • 11.3. Optymistyczna kontrola współbieżności
    • 11.4. Pesymistyczne blokowanie


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaka jest różnica między varchar a varchar2 w Oracle?

  2. Dlaczego nie mogę wprowadzić tej daty do tabeli za pomocą sql?

  3. Funkcja NANVL() w Oracle

  4. Sposób na sprawdzenie gotowego sql . Oracle

  5. Wprowadzenie do zmiennych PL/SQL w bazie danych Oracle