Mam metodę, która ma właściwość transakcyjnej na propagation = Propagation.REQUIRES_NEW
:Wiosna transakcja WYMAGANE vs REQUIRES_NEW: Wycofywanie transakcji
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void createUser(final UserBean userBean) {
//Some logic here that requires modification in DB
}
Metoda ta może być wywołana wielokrotnie jednocześnie, a dla każdej transakcji w przypadku wystąpienia błędu niż jest wycofywany (niezależnie od innych transakcji).
Problem polega na tym, że może to zmusić Spring do utworzenia wielu transakcji, nawet jeśli inna jest dostępna, i może powodować pewne problemy z wydajnością.
doc Java propagation = Propagation.REQUIRED
mówi: Support a current transaction, create a new one if none exists.
To wydaje się rozwiązać problem z wydajnością, prawda?
Co z problemem wycofania? Co się stanie, jeśli nowe wywołanie metody zostanie wycofane podczas używania istniejącej transakcji? czy to nie spowoduje wycofania całej transakcji nawet z poprzednich rozmów?
[EDIT] Chyba moje pytanie nie było wystarczająco jasne:
Mamy setki klientów podłączonych do naszego serwera.
Dla każdego klienta musimy oczywiście wysłać opinię o transakcji (OK lub wyjątek -> wycofanie).
Moje pytanie brzmi: czy używam REQUIRED
, czy oznacza to, że używana jest tylko jedna transakcja, a jeśli 100. klient napotka problem, transakcja 1. klienta również zostanie wycofana?
to właśnie kwestia REQUIRES_NEW, do tworzenia nowych transakcji za każdym razem, gdy metoda jest wywoływana. I tak, jeśli masz WYMAGANE i transakcja zostanie wycofana, wycofa całą sprawę. –
@DenisTulskiy Cała sprawa polegająca na tym, że każde poprzednie połączenie z tą fonction lub bieżącym stosem połączeń? –
@jidma: cała transakcja, patrz odpowiedź @ Eugena, jeśli 'createUser' jest pierwszą metodą, którą wywołuje twój kod klienta, to REQUIRES_NEW i REQUIRED to to samo –