一尘不染

休眠和事务以及表锁定

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方法,这是否意味着最好使交易简短并为父母的子女手动查找?


阅读 267

收藏
2020-06-20

共1个答案

一尘不染

Hibernate不会做任何事情来显式锁定您从中读取的表。答案确实取决于您使用的数据库以及隔离级别。通过读取行​​来锁定整个
在本世纪编写的任何功能齐全的数据库中都不会发生。对于任何多版本数据库,除非您自己明确锁定该行,否则什么都不会被锁定。

您的事务应该是原子工作单元所需的长度。没有正确或错误的长度。问问自己“这里发生的一切都作为一个单元成功还是失败,并且如果其中任何一个失败,所有这些都将一起回滚?”
这就是您设置交易的范围。

请记住,您不需要事务即可延迟加载!您只需要一个开放的会话。两者未链接。您可以提交事务,并使会话保持打开状态以保持延迟加载工作。

2020-06-20