如何使用JPA锁定数据库行

时间:2015-05-23 19:18:01

标签: 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);

请告诉我怎样才能完成这项工作,并建议我学习这个问题的好文章。

1 个答案:

答案 0 :(得分:1)

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

除了possible race condition之外,这对你的帮助太大了。在您的情况下,acquires an implicit lock时的实体flush operation issues an INSERT statement

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