Lockmodetype.Pessimistic_Read 正在锁定锁定行以外的行

Posted

技术标签:

【中文标题】Lockmodetype.Pessimistic_Read 正在锁定锁定行以外的行【英文标题】:Lockmodetype.Pessimistic_Read is locking rows other than locked rows 【发布时间】: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() 提交。但这并没有发生。

感谢您对此的任何帮助。

【问题讨论】:

你能说明你是如何真正锁定实体的吗? 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

感谢您的回复。第二个查询的 PESSIMIST_READ 也没有解决它。我认为 a2.methodToSelectRow2() 中的选择查询会扫描整个表。所以可能它正在等待锁定释放......不太确定...... 也许您可以发布查询或整个事务处理方法......让我们看看

以上是关于Lockmodetype.Pessimistic_Read 正在锁定锁定行以外的行的主要内容,如果未能解决你的问题,请参考以下文章

如何在spring data jpa查询中指定@lock超时?

Spring Data JPA / Hibernate中锁的范围是什么?

英语高手请进

简易先进先出队列-自用

函数参数

多重背包