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是您在谈论懒惰/关系时所寻找的模式。