【发布时间】:2014-09-20 20:20:22
【问题描述】:
我有一个简单的 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。为什么?我怎样才能做到这一点?
【问题讨论】:
标签: java sql hibernate locking