spring - 如何编写集成测试代码来验证 JPA @Lock(LockModeType.PESSIMISTIC_WRITE)
问题描述
我正在使用带有 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);
在上述情况下,第一个请求会触发选择查询,但之后它不再工作。
请提供相同的解决方案。如果您知道任何其他方法来编写相同的测试代码,请解释。
解决方案
推荐阅读
- timezone - 时区缩写
- pyspark - 通过将带有 fillna 的两列与 pyspark 中的现有列值连接起来创建新列
- javascript - 访问相邻 JS 文件中的函数时遇到问题
- python - PLOTLY 导入 Mapbox 图层“.mbtiles”格式
- dart - Dart 中的不同流
- node.js - 雪花节点查询未显示结果
- php - 向 PHP 脚本验证 AWS Lambda 函数
- javascript - 如何在 Chrome Dev-Tools 中访问 Lighthouse Panel 数据?
- python - 在 Cython 中将 int 指针(数组)转换为 int typed-memoryview 会在运行时引发 ValueError
- cloud - Google Cloud Platform 免费试用计费