6

Я искал решение, но, похоже, не нашел хорошего. У меня есть сложный сценарий, в котором я хотел бы, чтобы оценить поведение спящего режима оптимистичным замок против пессимистично замокВесна начало параллельных транзакций в интеграционном тесте

Идеальное место, чтобы сделать это было бы в хороший набор интеграционных тестов, но я могу» t, похоже, может найти чистый способ запуска параллельных транзакций.

  • Как я могу создать 2 параллельных транзакций в тесте интеграции в яровой без создания вручную Темы и инъекционного SessionFactory объектов.

Обратите внимание, что я не нашел способ создать две параллельные транзакции без появления не менее 2 потоков (возможно, есть способ, я надеюсь, вы можете показать мне пример этого).

+0

Вы не можете, поскольку вам понадобится хотя бы дополнительная нить. Транзакции и управление ресурсами основаны на потоках, так что пока у вас нет двух потоков, это будет сложно и очень запутанно. –

+0

OK, так что нет никакого пути без нереста Темы ... Есть ли весенний тест полезность для этого? Или какой-нибудь пример кода где-то? – victor

+0

, если вы говорите __parallel__, у вас должно быть 2 потока в вашем коде, иначе вы делаете плохой тест. Почему вы не хотите создавать новые потоки? – rascio

ответ

3

Добавление это как ответ, как там не хватает места на комментарии:

В прошлом я проверил на ванильным Spring, создавая разные EntityManager/сессии, а затем инъекционные тех. Я не уверен, как вы можете это сделать из теста интеграции Spring, но это может спровоцировать идею.

В следующем коде Учетная запись - это крошечный объект с версией. Вы можете добиться того же, если поток интеграции Spring (или что-то еще называется) может быть создан с помощью настраиваемого диспетчера сущностей.

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(); 
} 
Смежные вопросы