初学hibernate,今天看到了悲观锁与乐观锁。
在做悲观锁的实验时,发现一个问题,有点想不明白。希望大家帮助一下。
我写了两个单元测试方法,一个使用session.load(Class theClass, Serializable id, LockOptions lockOptions) 
使用LockOptions.UPGRADE。另一个方法中使用session.load(Class theClass, Serializable id),我在第一个测试方法
中加入断点,然后在提交事务之前运行第二个测试方法,发现第二个可以执行。
但是我所看到的资料说hibernate中悲观锁是通过数据库机制实现的,mysql中就是for update。那应该在事务提交前第二个方法是无法运行,应该阻塞啊。
是不是我哪里出错了,希望大家指正,谢谢。
新人,分不多。

解决方案 »

  1.   

    session.load(Class theClass, Serializable id)因为你这边是读而已, 读还是可以的, 如果你要保存的话就会阻塞了。或者你 load的时候, 也加个lock, 这时候也会阻塞
      

  2.   

    两次都是session.load 读操作,for update 锁定表的所有行应该是可读不能写的。
    另外只有在查询开始之前(也就是 Hiberate 生成 SQL 之前)设定加锁,才会
    真正通过数据库的锁机制进行加锁处理,否则,数据已经通过不包含 for update
    子句的 Select SQL 加载进来,所谓数据库加锁也就无从谈起。
      

  3.   

    估计for update是防修改,不防读,lz把第二个改成修改试试。还有,确保缓存里别有你将要load的对象,否则根本不产生sql。