@Repository
public class MyClass{
public int myFunction(Integer id){
Record x = recordDao.get(id,LockMode.UPGRADE);
int d = x.getProp();
x.setProp(d+1);
recordDao.update(z);
}
}
@Service
@Transactional
public class MyOtherClass{
@Autowired
private MyClass myClass;
public void myOtherFnx(Integer id){
try{
myClass.myFunction(id);
}catch(Exception e){
throw new RuntimeException(e.getMessage());
}
}
}
在同时调用new MyOtherClass().myOtherFnx(3)
但在单独的请求/事务处调用时会发生什么。
我尝试创建runnables并在不同的线程上调用myOtherFunx
来模拟并发。我期待得到RuntimeException但是
到目前为止,即使我将运行myOtherFunx
的线程增加到50,我也没有注意到任何运行时异常。
你能解释一下为什么会这样吗?或者我的假设是会发生运行时异常。我期待运行时异常的情况
当多个线程调用myClass.myFunction(3)
并且在这些线程上检索到的Record对象相同时,让我们说
ID = 3,丙= 4。由于其中一个首先获得锁定,当线程尝试更新记录时,只有一个应该更新而其他人将抛出异常,因为我正在捕获所有异常。
答案 0 :(得分:1)
第一个Thread将获取锁,并在提交或回滚时释放它。
当第一个线程正在执行其工作时,其余线程将等待以释放锁。
锁定释放后,下一个线程将获取它,执行更新,提交等等...
如果您想获得异常,则必须使用LockMode UPGRADE_NOWAIT
。