我有一个简单的Hibernate 3.6和MySQL设置。我想知道锁定是如何工作的。我的代码在这里:
package hibernate;
import java.util.*;
import org.hibernate.*;
public class HibernateGames {
public static void main(String[] args) {
//main transaction
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
Message loaded = (Message) session.get(Message.class, 21l);
session.lock(loaded, LockMode.PESSIMISTIC_WRITE);
//concurrent transaction
Session session2 = HibernateUtil.getSessionFactory().openSession();
Transaction tx2 = session2.beginTransaction();
Message loaded2 = (Message) session2.get(Message.class, 21l);
tx2.commit();
session2.close();
//main transaction committed
Message loadedAtLast = (Message) session.get(Message.class, 21l);
tx.commit();
session.close();
HibernateUtil.shutdown():
}
}
据我所知,每个数据库中有两种主要类型的锁:独占和共享。第一个完全阻止所有行操作,第二个允许其他用户从该行读取或获取自己的共享锁。第一个是由 select .. update 语句设置的,第二个是由 select .. lock in share mode 或类似的东西设置的。它是否正确?
在不同的隔离级别下它是否以不同的方式工作?
我的设置不会阻止并发事务tx2读取。为什么?我怎样才能做到这一点?
答案 0 :(得分:0)
我可能错了,但文章here说Hibernate会将锁定机制委托给DB,因此它取决于db上指定的隔离级别。另外,我在任何地方都看不到LockMode.PESSIMISTIC_WRITE
。您可以尝试使用LockMode.UPGRADE
锁定它并尝试查看它是否锁定。
如果您确实要在更新数据库操作中锁定行,请尝试在休眠配置中将隔离设置为serializable
。
更新:我认为您对JPA
和Hibernate
的LockMode感到困惑,LockMode.PESSIMISTIC_WRITE是jpa的事情,它可以与entityManager设置一起使用,它可能不会与会话一起工作。尝试用lockmode.UPGRADE替换它,这是一个休眠静态值。