本机查询中的Hibernate JpaRepository Lock Table

时间:2016-10-16 08:48:07

标签: java sql spring hibernate spring-data-jpa

我正在使用带有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错误。

知道怎么做吗?我也会接受其他方法来解决这个问题

0 个答案:

没有答案