我在JPA存储库中使用spring。
我正在尝试从一张表中获取序列号,并在进行一些操作后对其进行更新。
在这种情况下,我必须编写用于多线程事务的测试代码,即,如果一个请求从选择查询中获得了序列号,那么在第一个请求完成之前,另一个请求将无法访问该序列号。因此,我已经在互联网上进行搜索,找到了针对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);
在上述情况下,第一个请求触发选择查询,但此后它不再起作用。
请提供相同的解决方案。如果您知道用其他方法编写相同的测试代码,请解释。