使用JPA表独占锁定

时间:2015-09-01 16:20:17

标签: java jpa locking

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

1 个答案:

答案 0 :(得分:8)

我不认为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());

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