Chciałbym mieć współbieżny web serwis tak żeby w momencie kiedy jeden kontroller obsługuje mi jedną część web serwisu, to wtedy w drugiej karcie przeglądarki mógłbym otworzyć sobie zupełnie inną a co gorsza żeby to była tranzakcja xD . Użycie @Async raczej nie wchodzi w gre bo wtedy to i tak asynchroniczne byłyby metody warstwy serwisu ale nie całego kontrollera czyli gdybym miał w jednej karcie np. generowanie formularza(tak generowałoby się szybciej(wiem że nie zawze) bo asynchronicznie)to druga otworzona później musiałaby czekać w kolejce a nie o to mi chodzi
Więc chciałem użyć Callable ale gdy próbuję zrobić to w formie tranzakcji to wyskakuje mi błąd
There was an unexpected error (type=Internal Server Error, status=500).
No transaction aspect-managed TransactionStatus in scope
org.springframework.transaction.NoTransactionException: No transaction aspect-managed TransactionStatus in scope at org.springframework.transaction.interceptor.TransactionAspectSupport.currentTransactionStatus(TransactionAspectSupport.java:124) at org.springframework.samples.petclinic.controller.VisitController$1.call(VisitController.java:127) at org.springframework.samples.petclinic.controller.VisitController$1.call(VisitController.java:113) at org.springframework.web.context.request.async.WebAsyncManager.lambda$startCallableProcessing$4(WebAsyncManager.java:323) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)
Jak mógłbym zrobić tę część żeby była w zakresie tranzakcji?
@Transactional(isolation = Isolation.READ_COMMITTED)
@PostMapping("/owners/{ownerId}/pets/{petId}/visits/{visitId}/edit")
public Callable<String> processUpdateForm(@PathVariable("visitId") int visitId, @Valid Visit visit, BindingResult result){
return new Callable<String>() {
@Transactional(isolation = Isolation.READ_COMMITTED)
public String call() throws Exception {
visit.setId(visitId);
if (result.hasErrors()) {
return "pets/createOrUpdateVisitForm";
} else {
visitService.update(visit);
System.out.println("po dodaniu");
System.out.println(visitService.findById(visitId).getPrice());
System.out.println("po dodani2");
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return "redirect:/owners/{ownerId}";
}
}
};