何时明确排除乐观锁定(休眠)?

Posted

技术标签:

【中文标题】何时明确排除乐观锁定(休眠)?【英文标题】:When to explicitly exclude Optimistic Locking (Hibernate)? 【发布时间】:2011-09-14 22:19:14 【问题描述】:

在什么情况下,通过 Hibernate 从@OneToMany 关系中明确排除乐观锁定是合适的?

我一直在阅读有关 Hibernate 的帖子,其中基本上说对子实体的任何更新都会导致对父实体的乐观锁定,这通常是不需要的。这里的关键词是通常...谁能更准确地解释一下您何时需要或不需要乐观锁定这样的关系?

以下是演示乐观锁排除的代码示例:

// Bars - these are specifically excluded from optimist lock
// for the object, since we don't want to obtain optimistic
// lock when we add a new bar
@OptimisticLock(excluded = true)
@OneToMany
@JoinColumn(name = "FOO_ID", nullable = false, updatable = false)
private List<FooBar> bars = new LinkedList<FooBar>();

【问题讨论】:

【参考方案1】:

基本上,当父级在逻辑上“拥有”其子级时,您需要对一对多关系进行乐观锁定,换句话说,当父级和子级作为一个整体同时修改时。由OrderLines 组成的Order,以相同的形式呈现给用户,就是这种关系的一个例子。

否则,当孩子应该被单独修改时,他们应该被排除在乐观锁定之外。 TopicPosts 就是这种情况的一个例子。

从技术上讲,这个问题与关系的方向性有关。乐观锁定的目的是防止丢失修改,因此当可能丢失修改时,您需要为一对多关系启用它。当父级是关系的拥有方时会发生这种情况,换句话说,当一对多关系是单向的时(请注意,建模关系是自然的选择,例如Order-OrderLine )。

在双向一对多关系的情况下,“多”方是关系的拥有方,因此“一”方的关系修改不会影响数据库,因此它们不能迷路了。

【讨论】:

以上是关于何时明确排除乐观锁定(休眠)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在休眠中进行乐观锁定

带有休眠和触发器的乐观锁定 - “奇怪”行为

php并发控制 , 乐观锁

浅谈Mysql共享锁排他锁悲观锁乐观锁及其使用场景

使用乐观锁时会不会出现死锁?

浅谈Mysql共享锁排他锁悲观锁乐观锁及其使用场景