6

Szukałem rozwiązania, ale nie mogę znaleźć dobrego. mam złożony scenariusz, w którym chciałbym oceniać zachowanie hibernacji optymistyczne zamek vs pesymistyczny blokowaniaRozpoczęcie równoległych transakcji równoległych w teście integracji

idealne miejsce, aby to zrobić byłoby w dobrym zestawem testów integracyjnych, ale mogę” t wydaje się być w stanie znaleźć czysty sposób rozpoczęcia równoległych transakcji.

  • Jak można utworzyć 2 równolegle czynności w próbie integracji sprężyny bez ręcznego tworzenie wątki i wstrzykiwanie SessionFactory obiektów.

Zauważ, że nie znalazłem sposobu na stworzenie 2 równoległych transakcji bez pojawienia się co najmniej 2 wątków (być może jest sposób, mam nadzieję, że możesz pokazać mi przykład).

+0

Nie możesz, ponieważ będziesz potrzebować co najmniej dodatkowego wątku. Transakcje i zarządzanie zasobami są oparte na wątkach, więc dopóki nie masz 2 wątków, będzie to trudne i bardzo zawiłe. –

+0

OK, więc nie ma mowy bez spawnowania wątków ... Czy jest test sprężynowy narzędzie do użycia, aby to zrobić? A może jakiś przykład kodu gdzieś? – victor

+0

jeśli powiesz __parallel__ musisz mieć 2 wątki w swoim kodzie, w przeciwnym razie robisz zły test. Dlaczego nie chcesz tworzyć nowych wątków? – rascio

Odpowiedz

3

Dodawanie to jako odpowiedź, ponieważ nie znajduje się wystarczająco dużo miejsca na komentarze:

W przeszłości Przetestowałem na wiosnę waniliowym tworząc inny EntityManager/sesji, a później wstrzykiwanie tych. Nie jestem pewien, jak możesz to zrobić z testu integracji Spring, ale może to zainspirować.

W poniższym kodzie konto to mały obiekt, który ma przypisaną wersję. Można osiągnąć to samo, jeśli przepływ wiosennej integracji (lub jakkolwiek się nazywa) można utworzyć za pomocą niestandardowego menedżera jednostek.

public void shouldThrowOptimisticLockException() { 
     EntityManager em1 = emf().createEntityManager(); 
     EntityManager em2 = emf().createEntityManager(); 
     EntityTransaction tx1 = em1.getTransaction(); 
     tx1.begin(); 

     Account account = new Account(); 
     account.setName("Jack"); 
     account.updateAudit("Tim"); 

     em1.persist(account); 
     tx1.commit(); 


     tx1.begin(); 
     Account account1 = em1.find(Account.class, 1L); 
     account1.setName("Peter"); 

     EntityTransaction tx2 = em2.getTransaction(); 
     tx2.begin(); 
     Account account2 = em2.find(Account.class, 1L); 
     account2.setName("Clark"); 

     tx2.commit(); 
     em2.close(); 

     tx1.commit(); //exception is thrown here 
     em1.close(); 
} 
Powiązane problemy