2010-12-20 16 views
5

Powiedzmy mam aplikacji pulpitu, który działa jako garaż na kilka samochodów:wielu wątków dostępu do bazy danych: jedna z długimi transakcji, jednej z krótkich transakcji

@Entity 
public class Garage { 
    private List<Car> cars = new ArrayList<Car>(); 
    ... 
} 

Aplikacja Desktop „symulacją "przycisk uruchamiający nowy wątek i rozpoczynający wywoływanie metod w garażu, samochodzie, kole itp. Symulacja może trwać nawet 10 minut. W tej chwili mam klasy, który wygląda tak:

beginTransaction(); 
Garage garage = garageDao.findGarage(1); 
List<Car> cars = garage.getCars(); 
for (Car car : cars) { 
    // call methods on the car to lazily fetch other things like wheels... 
} 
commitTransaction(); 

Ten kod tylko nie „czyta” i nigdy nie „pisze”

Więc powyżej może zająć dużo czasu, w zależności od tego, jak źle samochody potrzebują serwis. W tym czasie użytkownik może nadal korzystać z aplikacji komputerowej. Mogą wybrać zmianę koloru samochodu, który jest używany w powyższej transakcji.

Moje pytanie brzmi, czy powyższa długa transakcja ma zapobiec zmianie koloru samochodu? tj. użytkownik zmieniający kolor samochodu w aplikacji komputerowej nie będzie mógł dokonać zmiany do czasu zakończenia długiej transakcji?

+0

Dlaczego potrzebna jest transakcja do przeczytania? Czy używasz leniwego pobierania? – saugata

+0

Czy "wątek aktualizacji" musi być pojedynczą jednostką transakcyjną? Czy nie ma żadnych aktualizacji? Mówisz "Ten kod tylko" czyta "i nigdy" nie pisze ", a następnie - jak zapytał Saugata - dlaczego potrzebujesz transakcji? –

+0

tak, metody, które są wywoływane w samochodzie, mogą być czymś w stylu getWheels() i leniwie pobrano: – digiarnie

Odpowiedz

4

Dlaczego powinien? Domyślnie używasz transakcji optymistycznych, więc nie ma blokowania, które należy zastosować do odczytanych wierszy (chyba że nie pokazujesz nam niektórych wywołań blokady JPA2). Zatwierdzenie transakcji powinno następnie sprawdzić optymistyczną wersję rekordów (jeśli masz zdefiniowaną wersję) i użyć jej do podjęcia decyzji o zatwierdzeniu zmian.

+0

nie, bez blokad() połączeń – digiarnie

0

Odpowiedź będzie najprawdopodobniej zależała od używanej bazy danych, a co ważniejsze od poziomu izolacji transakcji.

Ale odpowiedź brzmi generalnie: nie powinny blokować (Ale jak powiedziałem, zależą od poziomu bazy danych i transakcji).

0

Jak wyżej:

Normalnie, tylko do odczytu operacje nie powinny blokować operacji zapisu w bazie danych. Twój długotrwały wątek nie powinien blokować operacji zapisu krótkiego.

Przypuszczam, że możliwe jest skonfigurowanie poziomu izolacji dla bazy danych, a połączenie, które zapisuje, może być blokowane przez długie instrukcje odczytu, ale NIE jest to ustawienie domyślne dla żadnego z typów baz danych, które znam.

Powiązane problemy