是`session.getTransaction()。commit();`在获取数据时需要hibernate

时间:2014-10-08 06:29:04

标签: hibernate

我想知道

获取数据时,休眠时需要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;
    }

此示例取自http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/#tutorial-firstapp-firstclass

2 个答案:

答案 0 :(得分:2)

是的,即使是读操作也需要一个事务,它应该按照hibernate文档提交。

以下是详细信息:

13.2. Database transaction demarcation

  

数据库或系统,事务边界始终是必需的。没有   与数据库的通信可以在数据库之外进行   交易(这似乎混淆了许多习惯于开发人员的开发人员   自动提交模式)。 始终使用明确的交易边界,即使是   只读操作。取决于您的隔离级别和数据库   可能不需要这些功能,但如果没有任何缺点   你总是明确划分交易。当然,一个   数据库事务的性能要好于许多小事   交易,甚至是阅读数据。

对于普通JDBC,默认情况下启用自动提交。以下是详细信息:

Disabling Auto-Commit Mode

  

创建连接时,它处于自动提交模式。这意味着   将每个单独的SQL语句视为事务并且是   在执行后立即自动提交。(更多   精确,默认情况下是SQL语句提交时   完成,而不是在执行时。所有声明都完成了   已检索到其结果集和更新计数。几乎   但是,所有情况下,声明都已完成,因此已经提交,   它被执行后立即。)

答案 1 :(得分:1)

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

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


更新:
如果您想知道为什么要开始交易,可以查看以下similar post