Hibernate和事务以及表锁定

dig*_*nie 14 java 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();
Run Code Online (Sandbox Code Playgroud)

在开始和提交之间,正在读取的表是否被锁定,并且随后这将导致多用户环境中的问题,当另一个用户调用上面的相同代码时会发生问题?

如果上述问题,我们是否应该始终尝试保持交易简短?并且为了促进这一点,不是在惰性关系上调用getter方法,这是否意味着最好保持事务简短并为父母的子项手动查找?

Aff*_*ffe 19

Hibernate不会做任何事情来显式锁定你读取的表.答案实际上取决于您正在使用的数据库以及您的隔离级别设置的内容.通过读取行​​来锁定整个不应该发生在本世纪编写的任何全功能数据库中.对于任何多版本数据库,除非您自己明确锁定行,否则不会锁定任何内容.

您的交易应该是您的原子工作单元所需的任何长度.长度没有对错.问自己"这里发生的一切都会成功或失败作为一个整体,如果任何一件失败,所有人都会回滚吗?" 这是您为其设置交易的范围.

请记住,您不需要进行延迟加载的事务!你只需要一个开放的会话.这两者没有联系.您可以提交事务并保持会话打开以保持延迟加载工作.