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

Hibernate:事务中悲观锁的范围

王修为
2023-03-14

我在一个游戏服务器上使用Hibernate for ORM,刚刚从每个工作单元的会话/事务切换到每个请求的会话/事务。

由于多个事务可能相互冲突,因此我使用悲观锁定。问题是我经常遇到僵局。现在我的问题是,是否可以在锁定特定实体实例的事务中显式定义范围,或者在指定锁定模式后是否锁定实例直到我提交事务?

如果后者成立,如果我不能任意调度锁定数据库中资源的方法的方法调用,我如何避免每个请求环境中的会话事务中的死锁?

共有1个答案

端木渝
2023-03-14

锁总是绑定到事务,这就是数据库的工作方式。您应该尽可能地减少事务,所以我建议您坚持每个工作单元的事务。请注意,一个会话可以有多个事务。

我不知道您为什么切换到每个请求的会话,但我想是由于延迟加载问题?相信我,这不是一个解决方案,还伴随着许多其他问题。为了解决延迟加载问题,通常使用实体图和/或DTO。

我认为这是Blaze-Persistence实体视图的完美用例。

我创建了这个库来允许JPA模型和自定义接口或抽象类定义模型之间的轻松映射,类似于类固醇上的Spring Data Proj的东西。这个想法是你按照你喜欢的方式定义你的目标结构(域模型),并通过JPQL表达式将属性(getter)映射到实体模型。

DTO模型在使用Blaze Persistence实体视图时可能如下所示:

@EntityView(User.class)
public interface UserDto {
    @IdMapping
    Long getId();
    String getName();
    Set<RoleDto> getRoles();

    @EntityView(Role.class)
    interface RoleDto {
        @IdMapping
        Long getId();
        String getName();
    }
}

查询就是将实体视图应用于查询,最简单的就是通过id进行查询。

< code > user dto a = entityview manager . find(entityManager,UserDto.class,id);

Spring 数据集成允许您像 Spring 数据投影一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features

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

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

  • 我知道悲观锁定与锁定数据库记录,并在获得锁的“交易”结束时释放它。但这是否意味着悲观锁定是在物理交易中,例如 开始交易 提交事务? 对于一个网页,当用户选择要编辑的记录时,当他按下编辑按钮时,我想悲观地锁定此记录,以便其他人无法更改它,然后在编辑按钮onpress()事件中,我开始物理事务? 似乎是不可能的,因为编辑过程可能很长......它在整个编辑过程中保持数据库事务(按编辑按钮,在网页中编辑

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

  • 我上面代码的日志是: 数据库也会更新。为什么lock()不工作?不是在lock()之后其他实例无法更新吗?还是别的什么?还是我错过了什么?

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