java - 如何使用 JPA 锁定数据库行

标签 java hibernate jpa transactions locking

在下面的代码片段中,整个表被锁定,而不是单行:

@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void myInsertMethod(MyEntity myEntity) {

         
    /*1 this doesn't works*/
         manager.lock(myEntity,LockModeType.READ);
         manager.persist(myEntity);
    
    /* and this works but I dont know is it what i want or not...*/
        manager.persist(myEntity);
        manager.lock(myEntity,LockModeType.READ);
         
    }   

我认为正确的代码如下,但它不起作用

/*lock entire table for select*/
manager.lock(MyEntity.class.LockModeType.READ);
/* and after locking table persist code */
manager.persist(myEntity);

请告诉我如何完成这项工作,并推荐一篇好文章来学习这个问题。

最佳答案

LockModeType.READ is equals to OPTIMISTIC ,这意味着 Hibernate 会在事务完成之前尝试验证乐观锁定实体版本。

除了 possible race condition ,这不会对你有太大帮助。在您的情况下,实体 acquires an implicit lockflush operation issues an INSERT statement .

因为实体具有唯一的主键,所以您甚至不应该太关心锁定行,因为您不能让两个事务插入同一行。并发控制更适合 UPDATE/DELETE 语句,即使这样,您也不需要锁定整个表(只需锁定要更改的记录)。

关于java - 如何使用 JPA 锁定数据库行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30416653/

相关文章:

java - 如何将包含对象数组的 JSON 对象发送到 spring Controller ?

java - 使用 JTA 和 JPA EntityManager 关闭自动事务启动

java - 如何处理JPA存储库查询方法中的多个字段?

java - 如果为 ArrayList<Interface> 定义,则该方法不能应用于 ArrayList<ObjectImplementsInterface>

java - Jackson 在构造函数中使用 @JsonProperty 名称进行序列化

java - Vaadin 8 - 应用程序范围的缓存

java - hibernate:插入/更新时的自定义代码

Java EE 7 批处理 API (JSR-352) : it's possible to stop a single step and not all the job?

java - 带有 Hibernate Search/Lucene 的标签云?

java - 如何使用 Join 定义 JPA 存储库查询?