【问题标题】:Table exclusive lock with JPA使用 JPA 的表排他锁
【发布时间】:2015-09-01 16:20:16
【问题描述】:

是否可以使用 JPA 以与数据库无关的方式专门锁定整个表(例如,不使用本机查询)?到目前为止,我只看到了 EntityManager.lock(*),但这只会锁定给定的记录。

【问题讨论】:

标签: java jpa locking


【解决方案1】:

我不认为 JPA 本身就支持这一点 - 您总是锁定单个实体或每个实体,这是查询的结果。始终允许插入,因为它们是新实体。您可以使用数据库服务器支持的 SQL 使用本机查询来触发锁定,或者您需要以编程方式锁定插入。

通过编程我的意思是你需要在每次插入之前获取一个锁。您可以通过创建一个单独的锁定实体类来完成此操作,每个实体为您要锁定的表,然后在每次插入之前,您使用读取锁锁定特定实体,如下所示:

em.createQuery("select l from TableLock l where l.entity = :entityName", TableLock.class)
   .setParameter("entityName", MyEntity.class.getSimpleName())
   .setLockMode(LockModeType.PESSIMISTIC_READ)
   .getResultList();
em.persist(new MyEntity());

当然,你还要检查数据库中是否存在锁实体,如果不存在,先创建它,实体字段为你的实体名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    相关资源
    最近更新 更多