Как написать тестовый код интеграции для проверки JPA @Lock (LockModeType.PESSIMISTIC_WRITE) - PullRequest
0 голосов
/ 05 сентября 2018

Я использую пружину с репозиторием JPA.

Я пытаюсь получить порядковый номер из одной таблицы и после некоторых операций обновлять ее.

Мне нужно написать тестовый код для многопоточной транзакции в этом сценарии, т. Е. Если запрос получает порядковый номер из запроса select, то он не может быть доступен другим запросом до завершения первого запроса. Поэтому я искал по интернету и нашел решение для JPA, т.е.

 @Lock(LockModeType.PESSIMISTIC_WRITE)

Я реализовал вышеупомянутое утверждение с моей функцией репозитория, т.е.

@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query(value = "from FileNumberSequence where headBasicId = :headBasicId and headPrimaryId= :headPrimaryId and year = :year")
public FileNumberSequence getFileNumberSequence(@Param("headBasicId") Long headBasicId, 
                  @Param("headPrimaryId") Long headPrimaryId, @Param("year") Integer year);

Может быть, выше код будет работать нормально в производственной среде, но я должен написать тестовый код для того же.

Итак, я протестировал его с двумя транзакциями, т.е.

TransactionStatus status1 = transactionManager.getTransaction(new DefaultTransactionDefinition());

this.mockMvc
 .perform(MockMvcRequestBuilders.post("/file").contentType(MediaType.APPLICATION_JSON)
 .content(new ObjectMapper().writeValueAsString(this.fileDTO)))
 .andExpect(MockMvcResultMatchers.status().isOk());

transactionManager.commit(status1);
DefaultTransactionDefinition transactionDefinition = new DefaultTransactionDefinition();
transactionDefinition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
TransactionStatus status2 = transactionManager.getTransaction(transactionDefinition);

this.mockMvc
 .perform(MockMvcRequestBuilders.post("/file").contentType(MediaType.APPLICATION_JSON)
 .content(new ObjectMapper().writeValueAsString(this.fileDTO)))
 .andExpect(MockMvcResultMatchers.status().isOk());

transactionManager.commit(status2);

В приведенном выше сценарии при первом запросе запускается запрос select, но после этого он больше не работает.

Пожалуйста, предоставьте решение для того же. Если вы знаете какой-либо другой способ написания тестового кода для того же, пожалуйста, объясните.

...