【问题标题】:Hibernate Pessimistic Locking modeHibernate悲观锁定模式
【发布时间】:2015-01-16 05:28:35
【问题描述】:

我正在尝试了解 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){

            }
    }

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

我能够完美地测试乐观锁定,因此对于悲观锁定是否存在对概念的一些误解或者我的代码缺少某些东西。

【问题讨论】:

    标签: hibernate pessimistic-locking


    【解决方案1】:

    您也在使用单个会话和单个事务。 database locks 是可重入的,否则你最终会自己陷入僵局。

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

    【讨论】:

    • 是的,尝试使用两个会话进行访问就可以了。非常感谢您的解释。
    【解决方案2】:

    为了澄清这个概念,在石英中生成两个计划作业,每秒运行一次,以持久保存在您的数据库中。

    下面的链接包含代码。

    https://github.com/bozorgvar/JTA-Locking/tree/master/src/transaction

    检查以下文件:

    • schedule.java
    • HelloJob.java
    • HelloJob2.java

    【讨论】:

      猜你喜欢
      • 2014-08-30
      • 2018-10-22
      • 2013-09-16
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多