【问题标题】:Difference between SQL/Hibernate/Spring TransactionsSQL/Hibernate/Spring 事务之间的区别
【发布时间】:2021-05-24 05:33:37
【问题描述】:

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

在较低级别,使用 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 Transactions:

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

好的,我现在正试图了解它们之间的关系:

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

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

我也不需要管理 session.getTransaction().commit();不再在休眠层内。当我完成 saveA() 方法时,我进入以 getSession() 开头的 saveB() 方法。我从 saveA() 方法返回完全相同的会话。 当我的 save(A,B) 方法完成时,我的事务被提交,从而终止会话。

  1. 幕后:Spring 将创建一个 Hibernate Transaction。我在同一个事务中同时输入了 saveA() 和 saveB() 方法。那么Hibernate在创建真正的SQL查询时会生成SQL事务start transactioncommit

这样对吗?

【问题讨论】:

    标签: java hibernate jpa transactions spring-transactions


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2015-05-10
      • 2016-12-02
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      • 1970-01-01
      相关资源
      最近更新 更多