休眠、事务和表锁定

2022-09-03 06:01:53

如果我的代码如下所示:

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


答案 1

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

你的事务应该是原子工作单元所需的任何长度。没有正确或错误的长度。问问自己“这里发生的所有事情作为一个整体成功还是失败,如果任何一个部分失败,它们都会一起回滚?这是您为其设置事务的范围。

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


答案 2

最好的办法是保持交易简短。但是,锁定语义取决于事务隔离级别。

在视图中打开会话是您在谈论懒惰获取/关系时正在寻找的模式。


推荐