使用JPA进行表的独占锁。

12

在不使用原生查询的情况下,是否有可能以与数据库无关的方式独占锁定整个表格?到目前为止,我只看到过EntityManager.lock(*),但这仅会锁定给定记录。


你的意思是在映射到该表的实体上运行查询,并设置锁定模式。http://www.datanucleus.org/javadocs/javax.persistence/2.1/javax/persistence/Query.html#setLockMode-javax.persistence.LockModeType- - Neil Stockton
@NeilStockton 这样的东西,但我希望能实现整个表被锁定,防止任何修改。你的解决方案无法阻止插入操作。 - Radek Postołowicz
1个回答

13

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接