提问者:小点点

SQL/Hibernate/Spring Transactions之间的区别


我试图理解事物是如何运作的。我分开理解它们,但无法了解全貌。

在较低的级别,使用SQL查询在数据库内部执行:

start transaction
insert A
insert B
commit

在更高的级别上,有Hibernate或任何其他JPA提供程序。事情需要手动管理(我没有放置try/catch/roolback以使事情更易于阅读):

public saveAandB()
    Session session = HibernateUtil.getSessionFactory().openSession();
    session.beginTransaction();
    session.save(A);
    session.save(B);
    session.getTransaction().commit();
    session.close();

最后,在更高的层次上,有Spring交易:

@Transactional
public void save(A,B) {
    saveA(A);
    saveB(B);
}

好的,我现在正在努力理解它们之间的联系:

>

  • 使用@Transactional,Spring在我的服务开始时创建一个事务(使用从业务服务创建的代理)。

    使用Hibernate,我不再需要创建新的会话对象。我需要使用getSession()而不是openSession()我可以有单独的saveA()和saveB()方法,它们将在同一事务中执行(因为getSession()将返回相同的会话)

    我不需要管理session.getTransaction()。commit();在Hibernate层中。当我完成saveA()方法时,我进入以< code>getSession()开头的saveB()方法。我从saveA()方法中得到完全相同的会话。当我的save(A,B)方法完成时,我的事务被提交,从而终止会话。

    这是正确的吗?


  • 共1个答案

    匿名用户

    或多或少,是的。但请注意,JDBC 默认使用事务,即每个语句都在事务中运行,因此不需要显式的“启动事务”调用。