【问题标题】:Lockmodetype.Pessimistic_Read is locking rows other than locked rowsLockmodetype.Pessimistic_Read 正在锁定锁定行以外的行
【发布时间】:2017-06-16 07:45:42
【问题描述】:

我正在编写一个 JUnit 测试用例来验证一个线程中特定行的悲观读取不会锁定另一个线程中其他行的选择调用。

请看下面的伪代码:

public test(){

    service a = new service(entitymanager1);
    entitymanager1.beginTxn();
    a.methodToLockRow1();//has pessimistic_read lock to select 1st row

    new Thread(){
    run(){

        service a2 = new service(entitymanager2);
        entitymanager2.beginTxn();
        a2.methodToSelectRow2();//has no lock specified. only selects 2nd row  
        entitymanager2.commit();

    }
    }.start();

    Thread.sleep(5000)
    entitymanager1.commit();
}

我希望 a2.methodToSelectRow2() 执行而不等待 a.methodToLockRow1() 提交。但这并没有发生。

感谢您对此的任何帮助。

【问题讨论】:

  • 你能说明你是如何真正锁定实体的吗?

标签: java multithreading jpa locking


【解决方案1】:

我们通过将锁放在一个虚拟表而不是同一张表上来解决问题。谢谢。

【讨论】:

    【解决方案2】:

    我认为您需要在第二种方法中再次使用 PESSIMIST_READ 获取共享锁。否则,第二个事务将无法 commit().. 直到第一个事务完成。

    这里有一篇很棒的文章示例 -> article

    【讨论】:

    • 感谢您的回复。第二个查询的 PESSIMIST_READ 也没有解决它。我认为 a2.methodToSelectRow2() 中的选择查询会扫描整个表。所以可能它正在等待锁定释放......不太确定......
    • 也许您可以发布查询或整个事务处理方法......让我们看看
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    相关资源
    最近更新 更多