2010-12-04 90 views
13

如果我有代码,如下所示: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方法,这是否意味着尽量保持交易的简短性并且为父母的孩子手动找到最好的方法?

回答

18

Hibernate不会做任何事情来显式锁定您读取的表。答案真的取决于你正在使用的数据库以及你的隔离级别设置为什么。通过读取行​​锁定整个不应发生在本世纪所有写入的全功能数据库中。对于任何多版本数据库,除非您明确锁定该行,否则不会有任何锁定。

你的交易应该是你的原子工作单位需要的任何长度。没有正确或错误的长度。问问你自己:“这里发生的所有事情是否成功或失败,如果任何一件失败,都会一起回滚?”这是您设置交易的范围。

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

4

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

Open Session In View是您在谈论懒惰/关系时寻找的模式。