首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对Hibernate中的读和无LockMode的澄清?

对Hibernate中的读和无LockMode的澄清?
EN

Stack Overflow用户
提问于 2011-11-15 03:43:33
回答 1查看 4.7K关注 0票数 2

根据Hibernate文档中的Read LockMode,是一个共享锁。此锁定模式下的对象是从当前事务中的数据库中读取的,而不是从缓存中提取的.

代码语言:javascript
运行
复制
     SessionFactory sessions = new Configuration().configure().buildSessionFactory();
     Session session = sessions.openSession();
     Transaction tx = null;
        tx = session.beginTransaction();
        Person p1  = (Person)session. get(Person.class,1);//line 1
         p1  = (Person)session. get(Person.class,1);//line 2
         session. lock(p1, LockMode.READ);//line 3
         p1  = (Person)session. get(Person.class,1);//line4 
         p1  = (Person)session. get(Person.class,1);//line 5

现在,按照共享锁定义持有共享锁以防止编写器使用上面的代码片段进行并发访问,我使线程在第4行(因此它在此时获得了读模式的锁).Now--我尝试从另一个线程更新id 1的用户--成功了。不确定原因,因为按照定义,持有共享锁以防止写入器并发访问

正如读锁模式所述,此锁模式中的对象是从当前事务中的数据库中读取的,而不是从缓存中提取的。在我的第4行和第5行的代码片段中,它不是从id 1的数据库中得到行,而是从会话only.Why获得的行?

关于无锁模式的最后一个问题。根据文档,不需要锁。如果使用此锁定模式请求对象,则如果有必要从数据库中实际读取状态,而不是从缓存中提取状态,则将获得读取锁。正如声明的那样,没有获得锁,那么开发人员为什么要获取此锁,因为这是默认的。对吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-15 04:44:30

现在我尝试从另一个线程更新id 1的人,它成功了。不确定原因,因为根据定义,保持共享锁以防止作者并发访问

当线程1即将将一个实体写入数据库,而线程2将从它中读取同一个实体时,怎么样?他们中的任何一个都应该获得一个锁来读取或写入数据。如果thread1获得写入锁,则线程2必须等待写入完成。但是,如果线程2获得读锁,线程1在进入和写入数据时没有问题。这是因为当线程2以一致的状态读取记录时。只有在线程1写入数据库后,它才会失效(尽管,如果出现版本化的实体,线程2对该对象的写入将触发陈旧的状态异常)。读取锁的目的是防止不一致,而不是冻结记录,以便由同一事务进一步更新。您可以使用写锁来实现这种行为。

无锁模式的最后一个问题。根据文档,不需要锁。如果使用此锁定模式请求对象,则如果需要从数据库中实际读取状态,而不是从缓存中提取状态,则将获得读锁。如前所述,没有获得锁,那么开发人员为什么要获得这个锁,因为这将是默认的。对吗?

再一次,读取锁被调用,以防止实体处于不一致状态。从缓存中看,这不会是个问题。开发人员在进行获取时不需要指定读锁,它应该由持久性提供程序在内部管理。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8131208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档