Я использую пружину с репозиторием 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, но после этого он больше не работает.
Пожалуйста, предоставьте решение для того же. Если вы знаете какой-либо другой способ написания тестового кода для того же, пожалуйста, объясните.