我正在编写一个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()
提交的情况下执行。但事情并没有发生。
感谢您的任何帮助。
答案 0 :(得分:0)
我认为您需要再次使用PESSIMIST_READ在第二种方法中获取共享锁。没有它,第二个事务将无法提交()..直到第一个事务完成。
这里有一篇很棒的文章 - > article
答案 1 :(得分:0)
我们通过将锁放在虚拟表而不是同一个表上来解决。谢谢。