2012-04-12 16 views
11

Mam jedno pytanie dotyczące optymistycznego blokowania w Hibernacja. Próbuję zagłębić się w optymistyczne blokowanie za pomocą Hibernate, ale mam jedną wątpliwość. Hibernate używa podejścia do wersji (integer lub timestamp) do implementacji optymistycznego blokowania. Aby skonfigurować, możesz użyć adnotacji @Version (lub konfiguracji xml) i utworzyć atrybut wersji. Inną opcją jest konfigurowanie bez wersji z użyciem atrybutu optimistic-lock = "all".Optymistyczne blokowanie w Hibernate domyślnie

Moje pytanie jest, w przypadku których nie don zdefiniować dowolny atrybut wersjonowania i również nie podasz atrybut optymistyczne-lock, która strategia wykorzystuje Hibernate w takich przypadkach? Blokowanie Pessimistc Jestem prawie pewien, że nie, więc przypuszczam, że jest to optymistyczne blokowanie, ale nie wiem jak.

Dziękuję bardzo za uwagę.

Odpowiedz

33

Jeśli nie skonfigurujesz Hibernate w celu użycia optymistycznego blokowania, nie będzie ono w ogóle blokować. Tak więc w tym przypadku ostatnia aktualizacja zawsze wygrywa.

Wystarczy, aby było jasne, pamiętać, że Hibernate optymistyczne zamek jest zupełnie inna od DBMS izolacji transakcji. Optymistyczne blokowanie w trybie hibernacji działa tylko w sytuacji, gdy ładujesz obiekt w jednej transakcji, modyfikujesz go i zapisujesz później w innej transakcji. W tym przypadku optymistyczne blokowanie zapewnia, że ​​niektóre inne transakcje nie zmieniły tego obiektu w bazie danych pomiędzy. Optymistyczne blokowanie nie wpływa jednak na izolację równoczesnych transakcji - tak więc blokady (optymistyczne lub pesymistyczne) stosowane wewnętrznie przez DBMS do implementacji izolacji transakcji nadal działają, niezależnie od tego, czy blokowanie Hibernate jest włączone czy nie.

3

@axtavt, to w porządku, ale pytanie o tym, jak wdrożyć blokowania optymistycznego hibernacji bez @Version kolumnie.

Dziś cztery OptimisticLockType dostępne opcje:

/** 
* Perform no optimistic locking. 
*/ 
NONE, 
/** 
* Perform optimistic locking using a dedicated version column. 
* 
* @see javax.persistence.Version 
*/ 
VERSION, 
/** 
* Perform optimistic locking based on *dirty* fields as part of an expanded WHERE clause restriction for the 
* UPDATE/DELETE SQL statement. 
*/ 
DIRTY, 
/** 
* Perform optimistic locking based on *all* fields as part of an expanded WHERE clause restriction for the 
* UPDATE/DELETE SQL statement. 
*/ 
ALL 

Myślę, że to wystarczy, aby odpowiedzieć na oryginalne pytanie.