我发现使用事务是可选的,因为hibernate应用程序在自己的应用程序代码中管理事务。但是当我尝试执行没有Transaction的代码时,代码执行时没有任何错误,但数据库中没有数据。如何在不使用Transaction的情况下提交数据(因为它是可选的)?交易的替代方案是什么?
Configuration c = new Configuration();
c.configure("hibernate.cfg.xml");
SessionFactory sf = c.buildSessionFactory();
Session s = sf.openSession();
//Transaction t = s.beginTransaction();
//some code
//t.commit();
答案 0 :(得分:2)
数据库或系统,事务边界始终是必需的。在数据库事务之外不会发生与数据库的通信(这似乎使许多习惯于自动提交模式的开发人员感到困惑)。始终使用明确的事务边界,即使是只读操作(c)Hibernate transaction demarcation doc
有些文档说交易是可选的。
(可选)应用程序用于指定原子工作单元的单线程,短期对象。它从底层的JDBC,JTA或CORBA事务中抽象出应用程序。在某些情况下,org.hibernate.Session可能会跨越几个org.hibernate.Transactions。但是,使用底层API或org.hibernate.Transaction的事务划分永远不是可选的。 Basic API's / architecture doc
实际上意味着如果你在一个为你做事务划分的环境(容器/框架)中运行你的代码 - 你可以跳过使用Hibernate API来实现这个。< / p>
此API的替代方法是Spring Declarative Transaction management(基本上是注释,它们也有XML方式),Transaction demarcation in an EJB container等 - 这取决于您运行代码的位置。
事务是数据库的基本工作单元,它们是工作数据库所必需的,使用数据库的人应该始终指定事务的开始/结束位置。
您可以在ACID guarantees上阅读更多内容。
答案 1 :(得分:1)
来自docs
public interface Transaction
允许应用程序定义工作单元,同时保持对底层事务实现的抽象(例如,JTA,JDBC)。
事务与会话关联,并且通常通过调用Session.beginTransaction()
来实例化。单个会话可能跨越多个事务,因为会话的概念(应用程序和数据存储之间的对话)的粒度比事务的概念更粗略。 但是,任何时候最多只能有一个与特定会话相关联的未提交的交易。
因此很明显,如果没有Transaction