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

Hibernate悲观锁定模式

羊光辉
2023-03-14

我试图理解Hibernate中的悲观锁定机制(通过MySQL DB)。

我尝试运行以下示例:

    public static void main(String[] args) {
    SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
            Session session = sessionFactory.openSession();
    Student student = null;
    Student studentTwo = null;
            try {
                session.beginTransaction();     
                student = (Student) session.get(Student.class, 1, LockMode.PESSIMISTIC_WRITE);
//I was hoping this line would thrown an error
                studentTwo = (Student) session.get(Student.class, 1, LockMode.PESSIMISTIC_WRITE);            
                System.out.println(student.getName());
                System.out.println(studentTwo.getName());
                student.setName("John Doe"); 
                session.getTransaction().commit();

                session.close();
            }catch(HibernateException ex){

            }
    }

但它并没有给我一个错误,而是执行得很好。是不是我误解了什么概念。这种行为正常吗?

我能够完美地测试乐观锁定,那么对于悲观锁定,是对概念有一些误解,还是我的代码缺少了一些东西。

共有1个答案

马坚白
2023-03-14

您正在使用一个会话和一个事务。数据库锁是可重入的,否则您将自己导致死锁。

将示例更改为启动两个会话,每个会话都有自己的事务。然后您将看到第二个事务等待第一个事务释放获取的锁。

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

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

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

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

  • 我在一个游戏服务器上使用Hibernate for ORM,刚刚从每个工作单元的会话/事务切换到每个请求的会话/事务。 由于多个事务可能相互冲突,因此我使用悲观锁定。问题是我经常遇到僵局。现在我的问题是,是否可以在锁定特定实体实例的事务中显式定义范围,或者在指定锁定模式后是否锁定实例直到我提交事务? 如果后者成立,如果我不能任意调度锁定数据库中资源的方法的方法调用,我如何避免每个请求环境中的会话事

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