Hibernate 悲观锁模式
Hibernate Pessimistic Locking mode
我想了解 Hibernate 中的悲观锁定机制(超过 MySQL 数据库)。
我试过运行下面的例子:
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){
}
}
但是它没有给我一个错误,而是执行得很好。我是否误解了某种概念。这种行为正常吗?
我能够完美地测试乐观锁定,所以对于悲观锁定,是否存在对概念的误解或者我的代码缺少某些内容。
您也在使用单个会话和单个事务。 database locks 是可重入的,否则你会自己死锁。
更改示例以启动两个会话,每个会话都有自己的事务。然后你会看到第二个事务等待第一个事务释放获取的锁。
为了阐明这个概念,每秒在 quartz 运行 中生成两个计划作业以持久保存在您的数据库中。
波纹管 link 包含代码。
https://github.com/bozorgvar/JTA-Locking/tree/master/src/transaction
检查以下文件:
- schedule.java
- HelloJob.java
- HelloJob2.java
我想了解 Hibernate 中的悲观锁定机制(超过 MySQL 数据库)。
我试过运行下面的例子:
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){
}
}
但是它没有给我一个错误,而是执行得很好。我是否误解了某种概念。这种行为正常吗?
我能够完美地测试乐观锁定,所以对于悲观锁定,是否存在对概念的误解或者我的代码缺少某些内容。
您也在使用单个会话和单个事务。 database locks 是可重入的,否则你会自己死锁。
更改示例以启动两个会话,每个会话都有自己的事务。然后你会看到第二个事务等待第一个事务释放获取的锁。
为了阐明这个概念,每秒在 quartz 运行 中生成两个计划作业以持久保存在您的数据库中。
波纹管 link 包含代码。
https://github.com/bozorgvar/JTA-Locking/tree/master/src/transaction
检查以下文件:
- schedule.java
- HelloJob.java
- HelloJob2.java