如果我有如下代码:
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不会做任何事情来显式锁定您从中读取的表。答案确实取决于您使用的数据库以及隔离级别。通过读取行来锁定整个 表 在本世纪编写的任何功能齐全的数据库中都不会发生。对于任何多版本数据库,除非您自己明确锁定该行,否则什么都不会被锁定。
您的事务应该是原子工作单元所需的长度。没有正确或错误的长度。问问自己“这里发生的一切都作为一个单元成功还是失败,并且如果其中任何一个失败,所有这些都将一起回滚?” 这就是您设置交易的范围。
请记住,您不需要事务即可延迟加载!您只需要一个开放的会话。两者未链接。您可以提交事务,并使会话保持打开状态以保持延迟加载工作。