java - 是否可以防止通过 Hibernate 读取数据库行?

标签 java sql hibernate locking

我有 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 读取。为什么?我怎样才能做到这一点?

最佳答案

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

如果您真的想在更新数据库操作中锁定行,请尝试在 hibernate 配置中将隔离设置为 serializable

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

关于java - 是否可以防止通过 Hibernate 读取数据库行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25015689/

相关文章:

mysql - 给出错误结果的月份数

mysql - M :N relation an query

sql - Oracle SQL Developer - Ctrl+Enter 运行整个工作表而不是当前行

java - Hibernate 难以处理 HQL 中的 '@' 字符

java - hibernateexecuteUpdate 受影响的行数错误

java - ARCore – 无法创建 AR session

java - 想要在java中打印excel中特定单元格的所有行值

java - glassfish 7 + jakarta ee 10 + hibernate 实体管理器 java.lang.NoClassDefFoundError : org/hibernate/annotations/common/reflection/ReflectionManager

java - Hibernate查询帮助

java - Hadoop 从 HDFS 写入/读取 int[]