2015-01-16 3 views
1

Я пытаюсь понять пессимистический механизм блокировки в Hibernate (Over MySQL DB).Hibernate Пессимистический режим блокировки

Я попытался запустить следующий пример:

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

Вы используете один сеанс и одну транзакцию. database locks являются повторителями, так как иначе вы в конечном итоге зашли в тупик.

Измените свой пример, чтобы начать две сессии, каждая из которых имеет свою собственную транзакцию. Затем вы увидите вторую транзакцию, ожидающую, что первая освободит приобретенные блокировки.

+0

Хорошо, позвольте мне попробовать. Большое спасибо. –

+0

Да, попытка получить доступ с использованием двух сеансов сделала трюк. Большое спасибо за объяснение. –

0

Чтобы уточнить концепцию, сгенерируйте две запланированные задания в кварце, работающие каждую секунду, чтобы сохраняться в вашей БД.

Ниже приведен код.

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

проверить следующие файлы:

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