当前位置:编程学习 > JAVA >>

关于hibernate悲观锁的问题,理解不了。

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

因为你这边是读而已, 读还是可以的, 如果你要保存的话就会阻塞了。

或者你 load的时候, 也加个lock, 这时候也会阻塞 --------------------编程问答-------------------- 两次都是session.load 读操作,for update 锁定表的所有行应该是可读不能写的。
另外只有在查询开始之前(也就是 Hiberate 生成 SQL 之前)设定加锁,才会
真正通过数据库的锁机制进行加锁处理,否则,数据已经通过不包含 for update
子句的 Select SQL 加载进来,所谓数据库加锁也就无从谈起。 --------------------编程问答-------------------- 估计for update是防修改,不防读,lz把第二个改成修改试试。还有,确保缓存里别有你将要load的对象,否则根本不产生sql。
补充:Java ,  Java EE
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,