休眠LAZY获取VS乐观锁定版本



如果答案已经是响应,很抱歉,但我试图找到解决方案,但还找不到任何明确的答案。

我的问题是,LAZY获取关系之间存在任何关系,我知道他们可以控制是否必须加入其他实体,或者如果他们在会话中脏了,可以从数据库初始化,这是乐观锁定VERSION的原则?。

据我所知,如果我们必须同时处理多个事务,那么乐观锁定VERSION更为必要。是这样吗?。

如果我们在应用程序中执行的所有事务都是按顺序执行的,那么使用LAZY fetch来管理何时必须执行JOIN就足够了?。或者添加版本给我们任何附加值。

谢谢!

它们是两个完全不同的概念。只有当你获得或设置了一个惰性负载关系时,你才会遇到"惰性负载"。

如果你使用乐观锁定,并且你的行在V2上,它只会阻止从一个客户端提交修改后的V2(这会导致版本被提升到3),然后从另一个客户端中提交不同的V2,迫使他们重新加载数据并提交更高的版本。

如果您的逻辑命中了延迟加载的关系,然后命中了数千个其他关系,并最终加载了数百万行,那么您将遇到性能问题,而不是版本控制问题。在这种情况下,您可能需要增加批处理大小,或者进行一些提取连接,以确保您想要的任何内容都加载在一个块中,而不是数千个连续的SQL查询中。

所以,完全不同的问题空间。

如果你试图更新一个非常复杂的对象图,其中你的修改深入到该图中,你可能会遇到有趣的乐观锁定问题,因为很难确保整个树的"版本"是相同的。

更新:请澄清。

如果您有一辆汽车(具有单一特性,如品牌、型号、注册号)和多个车轮。这将是一个1:0..n的关系,表示为两个表,一个Car表和一个Wheel表,其中Wheel有一个FK返回到Car。(出于本文的目的,我们将忽略多对多关系)。

如果你懒惰地装载车轮,那么除非你感兴趣,如果你有轮辋旋转器、轮胎、锁紧螺母等,否则你永远不需要装载车轮记录,如果你只需要注册号,它们就不相关了。

你的汽车记录在V1上,它的注册号是AB1212

如果我,作为摩尔多瓦的车辆登记员,将其更新为AC4545并使用V1(当前版本)提交,我将成功,版本号将增加。除非需要,否则我不会撞到车轮。如果同时,另一个房间的Subaltern车辆登记员试图在V1上做同样的事情,它将失败,并出现StaleObjectException,同样,没有撞到车轮,因此没有调用惰性负载。

如果懒惰获取代理尝试获取由具有乐观锁定的不同事务(如果发生这种情况)更改的数据,它将抛出LazyInitializationException。

如果没有任何代码或一个好问题,很难提供帮助,但只要您将所有初始化都保持在@Transactional代码块内,您就会遇到很多麻烦。

话虽如此,你试图比较两个(功能上)非常不同的东西。。。

希望这能有所帮助。

最新更新