Table 使用 JPA 的独占锁
Table exclusive lock with JPA
是否可以以数据库不可知的方式使用 JPA 独占锁定整个 table(例如不使用本机查询)?到目前为止,我只看到 EntityManager.lock(*)
但这只锁定给定的记录。
我认为 JPA 本身不支持此功能 - 您总是锁定单个实体或作为查询结果的每个实体。始终允许插入,因为它们是新实体。您可以使用数据库服务器支持的 SQL 使用本机查询来触发锁定,或者您需要以编程方式锁定您的插入。
以编程方式我的意思是您需要在每次插入之前获取锁。您可以通过创建一个单独的锁定实体 class 来实现,每个实体对应一个您要锁定的 table,然后在每次插入之前,您使用读锁锁定特定实体,如下所示:
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());
当然你也要检查数据库中是否存在锁实体,如果不存在则先创建,实体字段为你的实体名称。
是否可以以数据库不可知的方式使用 JPA 独占锁定整个 table(例如不使用本机查询)?到目前为止,我只看到 EntityManager.lock(*)
但这只锁定给定的记录。
我认为 JPA 本身不支持此功能 - 您总是锁定单个实体或作为查询结果的每个实体。始终允许插入,因为它们是新实体。您可以使用数据库服务器支持的 SQL 使用本机查询来触发锁定,或者您需要以编程方式锁定您的插入。
以编程方式我的意思是您需要在每次插入之前获取锁。您可以通过创建一个单独的锁定实体 class 来实现,每个实体对应一个您要锁定的 table,然后在每次插入之前,您使用读锁锁定特定实体,如下所示:
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());
当然你也要检查数据库中是否存在锁实体,如果不存在则先创建,实体字段为你的实体名称。