Hibernate和事务以及表锁定
如果我的代码如下所示:
beginTransaction(); // lots of stuff happens, can take anywhere from a minute to several minutes. // it will read from several tables via calling getter methods on lazy relationships. commitTransaction();
在开始和提交之间,正在读取的表是否被锁定,随后这将导致多用户环境中的问题,当另一个用户调用上面的相同代码时会出现问题?
如果上述问题,我们是否应该始终尝试保持交易简短? 并且为了促进这一点,不是在惰性关系上调用getter方法,这是否意味着最好保持事务简短并为父母的子项手动查找?
Hibernate不会做任何事情来显式锁定你读取的表。 答案实际上取决于您正在使用的数据库以及您设置的隔离级别。 通过读取行来锁定整个表不应该发生在本世纪编写的任何全function数据库中。 对于任何多版本数据库,除非您自己明确锁定行,否则不会锁定任何内容。
您的交易应该是您的primefaces工作单元所需的任何长度。 长度没有对错。 问问自己“这里发生的一切都是成功还是失败作为一个单位,如果任何一件失败,所有人都会回滚?” 这是您为其设置交易的范围。
请记住,您不需要进行延迟加载的事务! 你只需要一个开放的会话。 这两者没有联系。 您可以提交事务并保持会话打开以保持延迟加载工作。
最好的办法是保持交易简短。 锁定语义依赖于事务隔离级别。
Open Session In View是您在谈论懒惰/关系时所寻找的模式。
- HibernateTemplate与SessionFactory
- 只是获取id列值而不是在hibernate对象中使用join一对多关系
- 如何防止JPA回滚交易?
- Hibernate Mapping – 使用关联表连接两个表 – 但是有一个扭曲
- @Where子句在hibernate join查询中不起作用
- 在删除和重新创建数据库之后强制Hibernate创建表
- 为什么我得到org.hibernate.id.IdentifierGenerationException?
- 我可以让Hibernate通过工厂方法创建一个对象吗?
- org.hibernate.LazyInitializationException:无法初始化代理 – 没有会话?