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

Dlaczego moje pesymistyczne blokowanie w JPA z Oracle nie działa?

W końcu udało mi się to zrobić, ale z pewnymi modyfikacjami. Pomysł polega na użyciu LockModeType.PESSIMISTIC_FORCE_INCREMENT zamiast PESSIMISTIC_WRITE. Używając tego trybu blokady, zadania Cron zachowują się w następujący sposób:

  1. Kiedy pierwsze zadanie wybiera aktualizację, wszystko idzie zgodnie z oczekiwaniami, ale zmienia się wersja obiektu.
  2. Jeśli inne zadanie próbuje dokonać tego samego wyboru, podczas gdy pierwsze jest nadal w swojej transakcji, JPA uruchamia wyjątek OptimisticLockException, więc jeśli przechwycisz ten wyjątek, możesz być pewien, że został on rzucony z powodu blokady odczytu.

To rozwiązanie ma różne odpowiedniki:

  1. SynchronizedCronJobTask musi mieć pole wersji i być pod kontrolą wersji za pomocą @Version
  2. Musisz obsłużyć OptimisticLockException i powinien być on przechwycony poza metodą usługi transakcyjnej, aby dokonać wycofania, gdy nastąpi odblokowanie.
  3. IMHO to nieeleganckie rozwiązanie, znacznie gorsze niż zwykła blokada, w której zadania Cron czekają na zakończenie poprzednich zadań.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wszystkie przydatne dynamiczne widoki wydajności 11g

  2. Jak utworzyć słaby kursor odniesienia PL/SQL w bazie danych Oracle

  3. Dlaczego porządek sortowania varchar Oracle nie odpowiada zachowaniu porównania varchar?

  4. RU czy RUR?

  5. Co oznacza select count(1) z table_name w dowolnych tabelach bazy danych?