我想知道
获取数据时,休眠时需要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
答案 0 :(得分:2)
是的,即使是读操作也需要一个事务,它应该按照hibernate文档提交。
以下是详细信息:
13.2. Database transaction demarcation
数据库或系统,事务边界始终是必需的。没有 与数据库的通信可以在数据库之外进行 交易(这似乎混淆了许多习惯于开发人员的开发人员 自动提交模式)。 始终使用明确的交易边界,即使是 只读操作。取决于您的隔离级别和数据库 可能不需要这些功能,但如果没有任何缺点 你总是明确划分交易。当然,一个 数据库事务的性能要好于许多小事 交易,甚至是阅读数据。
对于普通JDBC,默认情况下启用自动提交。以下是详细信息:
创建连接时,它处于自动提交模式。这意味着 将每个单独的SQL语句视为事务并且是 在执行后立即自动提交。(更多 精确,默认情况下是SQL语句提交时 完成,而不是在执行时。所有声明都完成了 已检索到其结果集和更新计数。几乎 但是,所有情况下,声明都已完成,因此已经提交, 它被执行后立即。)
答案 1 :(得分:1)
AFAIK:在大多数情况下,它并不重要。两种方法(提交/回滚)都是有效的。
但推荐的方法是提交,因为关系数据库是针对最常见的预期情况进行性能优化的,提交,而不是回滚。
更新:
如果您想知道为什么要开始交易,可以查看以下similar post。