是“session.getTransaction().commit();”获取数据时在hibernate中需要

是“session.getTransaction().commit();”获取数据时在hibernate中需要,hibernate,Hibernate,我想知道 是session.getTransaction().commit() private List listEvents() { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); List result = session.createQuery("from Event").list();

我想知道

session.getTransaction().commit()

private List listEvents() {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        List result = session.createQuery("from Event").list();
        session.getTransaction().commit();
        return result;
    }

这个例子取自AFAIK:在大多数情况下,这并不重要。这两种方法(提交/回滚)都是有效的

但是推荐的方法是提交,因为关系数据库针对最常见的预期情况进行了性能优化,即提交,而不是回滚


更新:

如果您想知道为什么要启动事务,可以看看下面的内容。

是的,即使对于读取操作,您也需要一个事务,并且应该按照hibernate文档提交它

详情如下:

数据库或系统事务边界始终是必需的。不 与数据库的通信可以在数据库外部进行 事务(这似乎让许多习惯于 自动提交模式)始终使用清晰的事务边界,即使对于 只读操作。取决于您的隔离级别和数据库 这可能不是必需的功能,但如果 您总是明确地划分事务。当然可以,单人间 数据库事务将比许多小型事务执行得更好 事务,甚至用于读取数据

对于普通JDBC,默认情况下会启用自动提交。详情如下:

创建连接时,连接处于自动提交模式。这意味着 每个单独的SQL语句都被视为一个事务,并且 执行后立即自动提交。(更多信息 确切地说,默认情况下,SQL语句在被提交时提交 已完成,而不是在执行时。当所有 它的结果集和更新计数已检索。在 但是,所有案件都已完成陈述,因此已提交, 就在它被执行之后。)


但是,为什么需要它却各不相同。良好的实践是为每个DB操作打开事务。此外,事务还可用于确保没有其他事务添加导致视图不一致的数据。