java 休眠和事务和表锁定
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4351212/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Hibernate and transactions and table locking
提问by digiarnie
If I have code that looks like the following:
如果我的代码如下所示:
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();
In between the begin and commit, are the tables that are being read from being locked and subsequently will this cause problems in a multi-user environment where issues will occur when the same code above is called by another user?
在开始和提交之间,正在读取的表是否被锁定,随后这是否会在多用户环境中导致问题,当另一个用户调用上述相同代码时会出现问题?
If the above is problematic, should we always try and keep transactions short? and to facilitate this, instead of calling getter methods on lazy relationships, does that mean its best to keep the transactions short and do finds manually for the children of the parents?
如果上述问题有问题,我们是否应该始终尝试保持交易简短?为了促进这一点,而不是在惰性关系上调用 getter 方法,这是否意味着最好保持事务简短并为父母的孩子手动查找?
回答by Affe
Hibernate is not going to do anything to explicitly lock tables you read from. The answer really depends on what Database you're using and what your isolation levels are set to. Locking an entire tableby reading rows shouldn't happen in any full featured database written in this century. For any multiversioning database, nothing is going to get locked unless you explicitly lock the row yourself.
Hibernate 不会做任何事情来显式锁定您读取的表。答案实际上取决于您使用的数据库以及您设置的隔离级别。在本世纪编写的任何功能齐全的数据库中,都不应该通过读取行来锁定整个表。对于任何多版本数据库,除非您自己明确锁定该行,否则不会锁定任何内容。
Your transactions should be whatever length they need to be for your atomic unit of work. There's no right or wrong length. Ask yourself "does everything that happens here succeed or fail as a single unit and all get rolledback together if any one piece fails?" That's the scope you set a transaction for.
您的事务应该是原子工作单元所需的任何长度。没有正确或错误的长度。问问自己“这里发生的所有事情是作为一个整体成功还是失败,如果任何一个失败,所有事情都会一起回滚吗?” 这就是您为其设置事务的范围。
Remember, you do not need a transaction to have lazy loading! You just need an open Session. The two are not linked. You can commit your transaction and keep your session open to keep lazy loading working.
请记住,延迟加载不需要事务!你只需要一个开放的会话。两者没有联系。您可以提交事务并保持会话打开以保持延迟加载工作。
回答by Aravind Yarram
The best thing is to keep transactions short. The locking semantics depends on the transaction isolation levels though.
最好的办法是保持交易简短。不过,锁定语义取决于事务隔离级别。
Open Session In Viewis the pattern your are looking for when you are talking about lazy-fetching/relationships.
在视图中打开会话是您在谈论延迟获取/关系时正在寻找的模式。