在不使用原生查询的情况下,是否有可能以与数据库无关的方式独占锁定整个表格?到目前为止,我只看到过EntityManager.lock(*)
,但这仅会锁定给定记录。
在不使用原生查询的情况下,是否有可能以与数据库无关的方式独占锁定整个表格?到目前为止,我只看到过EntityManager.lock(*)
,但这仅会锁定给定记录。
我认为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());
当然,您还应该检查数据库中是否存在锁实体,如果不存在,请先创建它,实体字段为您的实体名称。