【问题标题】:How to lock a databse row with JPA如何使用 JPA 锁定数据库行
【发布时间】:2015-08-05 15:42:18
【问题描述】:

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

@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);

请告诉我如何才能完成这项工作,并为我推荐一篇学习此问题的好文章。

【问题讨论】:

  • 为什么要锁定整个表?
  • 因为在该表上运行选择查询时,在服务器上发送持久请求时未获取数据
  • 您应该让您的 RDBMS 担心是否需要表或行锁。您使用的是哪个数据库?
  • 我正在使用 Oracle 数据库
  • 我在这张表上的select方法很重要,如果有人插入数据,select就会不同。如果发送持久请求,我会锁定哪个表...

标签: java hibernate jpa transactions locking


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 2017-11-13
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多