我正在使用带有hibernate 5的spring boot和用于我的Dao的JpaRepository接口。
我有一种情况,外部服务可以要求令牌做一些工作,然后在完成后返回令牌。我可以发出多少令牌是有限制的。
我目前的解决方案是计算表中现有“IN_PROGRESS”记录的数量,然后根据结果将另一个“IN_PROGRESS”或“DECLINED”行插入到我的表中。然后我将该记录归还给我。这是看起来像什么
@Query(nativeQuery = true, value = "" +
"INSERT INTO migration_records (id, client_id, status) " +
"SELECT ?1, ?2," +
" CASE WHEN (SELECT count(*) " +
" FROM (SELECT id FROM migration_records " +
" WHERE status = 'IN_PROGRESS' FOR UPDATE) recs) >= " +
" CAST((SELECT VALUE " +
" FROM settings " +
" WHERE id = 'POOL_SIZE') AS NUMERIC) " +
" THEN 'DECLINED' " +
" ELSE 'IN_PROGRESS' END "
)
@Modifying
int createMigration(UUID migrationId, String clientId);
我认为查询的FOR UPDATE
部分会有所帮助,但我仍然会遇到很多竞争条件。
我尝试添加此'@Transactional(isolation = Isolation.REPEATABLE_READ)
注释,但后来又出现java.lang.IllegalStateException: EntityManager is closed
错误。
知道怎么做吗?我也会接受其他方法来解决这个问题