Hibernate Pessimistic Locking模式

时间:2015-01-16 05:28:36

标签: hibernate pessimistic-locking

我试图了解Hibernate(Over 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){

            }
    }

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

我能够完美地测试乐观锁定,所以对于悲观锁定是对概念的一些误解,或者我的代码缺失了。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

为了阐明这个概念,每秒运行一次石英运行的两个预定作业,以便在数据库中保留。

波纹管链接包含代码。

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

检查以下文件:

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