当前位置: 首页 > 知识库问答 >
问题:

Hibernate悲观锁定不适用于多态查询

壤驷志学
2023-03-14

我有以下类层次结构:

@Entity
@Table(name = "BaseThing")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class BaseThing implements Serializable {

    @Id
    @Column(name = "id", nullable = false)
    private Long id;

    @Basic(optional = false)
    @Column(name = "name", nullable = false, length = 48)
    private String name;
    ...
}

@Entity
@Table(name = "ConcreteThing")
public class ConcreteThing extends BaseThing {

    @Column(name = "aprop", nullable = false, length = 12)
    private String aProp;

    ...
}

@Entity
@Table(name = "AnotherConcreteThing")
public class AnotherConcreteThing extends BaseThing {

    @Column(name = "anotherprop", nullable = false, length = 12)
    private String anotherProp;

    ...
}

我正在尝试读取并锁定一个具体实例,以便其他事务无法读取它,使用hibernatelockoptions.upgrade

现在的函数:

BaseThing thing = (BaseThing) session.get(BaseThing.class, id, LockOptions.UPGRADE);
BaseThing entity = (BaseThing) session.get(BaseThing.class, id);
session.refresh(entity, LockOptions.UPGRADE));

正在工作-为刷新操作生成“SELECT for UPDATE”语法。

refresh()和get()函数之间的不同之处在于get()函数使用外部左联接来选择具体对象,而refresh()使用内部联接来选择具体对象。

在悲观锁定的上下文中,这些连接之间有区别吗?

共有1个答案

单于飞鸣
2023-03-14

某些数据库不支持使用外部联接进行select for update。

在我的例子中,im使用DB2Version10.5,它支持。所以问题依然存在。

在深入挖掘hibernate代码之后,我发现DB2Dialke有一个函数supportSouterJoinForUpdate()返回false,而假设返回true,因为BD2支持这种选择。这是冬眠的虫子。扩展db2方言并为该函数返回true,为我解决了这个问题。

 类似资料:
  • 我试图理解Hibernate中的悲观锁定机制(通过MySQL DB)。 我尝试运行以下示例: 但它并没有给我一个错误,而是执行得很好。是不是我误解了什么概念。这种行为正常吗? 我能够完美地测试乐观锁定,那么对于悲观锁定,是对概念有一些误解,还是我的代码缺少了一些东西。

  • 问题内容: 我在java下有spring项目,使用hibernate查询,我喜欢使用悲观锁定。 在Spring + Hibernate中如何进行悲观锁定? 编辑: 问题: 我想在一个方法中使用悲观锁定,并且我将此方法称为从不同的方法。当我从第一个方法调用它时,悲观的工作效果很好,但是当我从第二个方法调用它时,它给出了(无法提交事务) 例外: 问题答案: http://www.amicabile.c

  • 我正在使用Spring Boot、JPA、Oracle 12C和下面的类型化查询来选择要处理的“新”项目。一旦我选择了“新”项目,我就会更新其状态,使其不再符合选择条件,但我看到一个并发问题,相同的项目被选中。 我在这里读到,我需要设置一个'LockModeType.PESSIMISTIC_WRITE'的查询,以防止其他线程选择相同的行,但它似乎不起作用。 我是否遗漏了下面的内容,或者我是否需要另

  • 编辑:在这种情况下,因为我使用了“版本”注释,所以我使用了乐观锁定,而不是悲观锁定。< br >如果我删除版本并因此禁用乐观锁定。悲观锁定会接管,性能会显著下降。< br >所以我想我必须忍受乐观锁定和偶尔的异常。有没有更好的解决办法? 原文:我目前通过ajp在apache 2.2负载均衡器中有多个Tomcat实例。后端系统处于Hibernate状态。该系统为多个用户和请求提供服务,对于请求,它会

  • 用户其实并不需要花很多精力去担心锁定策略的问题。通常情况下,只要为 JDBC 连接指定一下隔离级别,然后让数据库去搞定一切就够了。然而,高级用户有时候希望进行一个排它的悲观锁定,或者在一个新的事务启动的时候,重新进行锁定。 Hibernate 总是使用数据库的锁定机制,从不在内存中锁定对象。 类 LockMode 定义了 Hibernate 所需的不同的锁定级别。一个锁定可以通过以下的机制来设置:

  • 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作 乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。 乐观锁与悲观锁的具体区别: http://www.cnblogs.com/Bob-FD/p/3352216.html