【问题标题】:Is it possible to prevent a database row from being read via Hibernate?是否可以防止通过 Hibernate 读取数据库行?
【发布时间】: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():
    }
}
  1. 据我了解,每个数据库中都有两种主要类型的锁:独占锁和共享锁。第一个完全阻止对该行的所有操作,第二个让其他用户从该行读取或获取自己的共享锁。第一个由 select.. update 语句设置,第二个由 select .. lock in share mode 或类似的设置。它是否正确?

  2. 它在不同的隔离级别下是否以不同的方式工作?

  3. 我的设置不会阻止读取并发事务 tx2。为什么?我怎样才能做到这一点?

【问题讨论】:

    标签: java sql hibernate locking


    【解决方案1】:

    我可能错了,但是文章here说Hibernate会将锁定机制委托给DB,所以这取决于db上指定的隔离级别。另外,我在任何地方都看不到LockMode.PESSIMISTIC_WRITE。您可以尝试使用LockMode.UPGRADE 锁定它并尝试查看它是否锁定。

    如果您确实想在更新数据库操作中锁定该行,请尝试在休眠配置中将隔离设置为serializable

    更新:我相信您对 JPAHibernate 的 LockMode 感到困惑,LockMode.PESSIMISTIC_WRITE 是 jpa 的东西,它适用于 entityManager 设置,它可能不适用于会话。尝试用 lockmode.UPGRADE 替换它,它是一个休眠静态值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      • 2017-09-02
      • 2020-11-01
      • 1970-01-01
      • 2015-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多