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