很抱歉,如果答案已经回复,但我试图找出解决方案,但我找不到任何明确的内容。
我的问题是,LAZY获取关系之间有任何关系,我知道他们有控制权来知道他们是否必须加入或不加入其他实体,或者如果他们在会话中是脏的则从数据库初始化乐观锁定原则VERSION?。
据我所知,如果我们必须同时处理多个事务,则乐观锁定VERSION更为必要。这是正确的吗?。
如果我们在应用程序中执行的所有事务都按顺序完成,那么在JOINS必须完成时使用LAZY fetch来管理就足够了吗?或者添加版本可以为我们添加任何价值。
谢谢!
答案 0 :(得分:2)
它们是两个完全不同的概念。你只打了一个懒惰的负载"如果你得到或设置了一个懒惰的关系。
如果您正在使用乐观锁定并且您的行在V2上,它只是阻止从一个客户端提交修改后的V2(导致版本升级到3),然后从另一个客户端提交不同的V2,强制他们重新加载数据并提交更高版本。
如果您的逻辑遇到延迟加载的关系,然后达到数千个其他关系并最终加载数百万行,您将遇到性能问题,而不是版本问题。在这种情况下,您可能需要增加批量大小,或者可能需要执行一些提取连接,以确保在一个块中加载您想要的任何内容而不是数千个连续的SQL查询。
所以,完全不同的问题空间。
如果您正在尝试更新非常复杂的对象图,您的更改会深入到该图中,您可能会遇到有趣的乐观锁定问题,因为它确保了整个树的版本"版本&#34 ;同样是困难的。
更新:澄清。
如果你有一辆Car(具有诸如品牌,型号,注册号等单一属性)和车轮的多个。这将是一个1:0..n关系,表示为两个表,一个Car表和一个Wheel表,其中Wheel有一个FK返回Car。 (就本文而言,我们将忽略多对多关系。)
如果你懒得加载你的车轮,那么除非你有兴趣,如果你有轮辋旋转器,轮胎,锁紧螺母等,你永远不需要加载轮子记录,如果你只需要它们就不相关注册号码。
您的汽车记录在V1上,其注册号为AB1212
如果我,作为摩尔多瓦的车辆登记员将其更新到AC4545并提交V1(当前版本),我将成功,版本号将增加。除非我需要,否则我不会碰到车轮。如果同时,另一个房间的Subaltern Vehicle注册商试图在V1上做同样的事情,那么它将失败并出现StaleObjectException,再次没有击中Wheels,因此没有调用延迟加载。
答案 1 :(得分:0)
如果lazy fetch代理尝试使用乐观锁定来获取由不同事务(如果发生这种情况)更改的数据,则会抛出LazyInitializationException。
没有任何代码或一个好问题很难提供帮助,但只要您将所有初始化保留在@Transactional
代码块中,您就会遇到很多麻烦。
话虽如此,你试图比较两个(功能上)非常不同的东西......
希望这有帮助。