Hibernate LockMode预期的行为

时间:2015-09-29 18:26:24

标签: spring hibernate concurrency

@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。由于其中一个首先获得锁定,当线程尝试更新记录时,只有一个应该更新而其他人将抛出异常,因为我正在捕获所有异常。

1 个答案:

答案 0 :(得分:1)

第一个Thread将获取锁,并在提交或回滚时释放它。

当第一个线程正在执行其工作时,其余线程将等待以释放锁。

锁定释放后,下一个线程将获取它,执行更新,提交等等...

如果您想获得异常,则必须使用LockMode UPGRADE_NOWAIT