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

时间:2017-01-31 00:49:21

标签: java multithreading jpa locking

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

请参阅下面的伪代码:

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()提交的情况下执行。但事情并没有发生。

感谢您的任何帮助。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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