“Spring 事务”和“Hibernate 事务”有啥区别

Posted

技术标签:

【中文标题】“Spring 事务”和“Hibernate 事务”有啥区别【英文标题】:What is the difference between a "Spring transaction" and a "Hibernate transaction"“Spring 事务”和“Hibernate 事务”有什么区别 【发布时间】:2015-05-10 23:58:59 【问题描述】:

能否请您解释一下以下两种交易类型的区别:

    休眠事务 春季交易

我也想知道@Transactional注解。

【问题讨论】:

Spring 事务管理器(如果配置正确)可以管理休眠事务。 @Transactional 是在Spring 中声明事务方法的方式。所以区别与车轮和方向盘的区别是一样的,当“配置正确”时,旋转方向盘会移动车轮......两者都是***:)。 【参考方案1】:

对于初学者来说,它们都是事务,但它们包含不同的概念和组件。

TL;DR

Hibernate 处理特定于数据库的事务,而 Spring 提供一般事务管理服务。 @Transactional 是配置事务管理行为的好方法。

长篇大论:

交易

事务基本上是作为单个操作进行管理的工作单元(即对某些内容的更改),可以提交或回滚。 Java 世界中有许多不同类型的事务——数据库、消息传递系统(如 JMS)、应用程序间事务(适用于那些胆小的人)或任何其他可能需要包含在事务中的事务。在 Java 标准中,事务是使用 Java Transaction API 管理的,它设置了如何参与事务的规则。

休眠

Hibernate 是一种用于将数据库组件抽象为 Java 对象的 ORM,因此它的事务与数据库中所做的更改特别相关。一个事务可能由对各种数据库表的一次或多次写入组成,一旦操作完成,这些操作就会全部提交。回滚事务,例如在操作过程中出现任何错误,可以撤消所有更改。

春天

在其最低级别Spring 是一个应用程序框架,用于管理对象之间的配置和依赖关系。此外,它还提供了一个接口,用于管理现代应用程序中使用的更高级别的服务,例如数据库、消息传递服务、MVC 框架和事务。

Spring 被设计为在应用程序中用作对象和服务的无所不包的主人,因此它的事务概念比 hibernate 所关注的特定于数据库的事务处于更高的级别。 Spring Transactions 旨在为您提供对所有事务资源的细粒度控制,同时抽象出协调事务所需的通常混乱的编码。

@Transactional

Spring 提供了几种使用事务的不同方法——其中包括基于 xml 的方面、API 编码和基于注释的声明性事务。基于注释的事务很方便,因为您不需要将事务管理样板代码添加到您的应用程序中(即使通过 API 使用 PlatformTransactionManager 也有相当多的编码开销)。

所以基本上@Transactional 发生的情况是,在运行时,sp​​ring 会根据您通过注释配置的内容,扫描您的代码库中的 @Transactional 类和方法,并将它们包装在特定于事务的管理代码中。所以像这样的方法:

@Transactional(propagation = REQUIRES_NEW, rollbackFor = Exception.class)
public void saveAndSendMessage(Foo foo) throws Exception 
    dbManager.save(foo);
    Bar bar = transform(foo);
    jmsSystem.send(bar);
  

可以让spring为数据库和jms系统建立一个新的事务,并协调它们,而不需要自动添加所有特定的tx管理代码。

【讨论】:

【参考方案2】:

编码级别尊重

春天

在Spring中,我们可以执行如下事务

@Transactional(readOnly=”false”)
public int insert(int studentId, String name, int courseId) 
    int outcome = 0;
    outcome = studentDao.insert(studentId, name);
    if (outcome > 0) 
   // re-intialize
        outcome = 0;
        outcome = studentCourseDao.insert(studentId, courseId);
    
   return outcome;

看到@Transactional 后,Spring IOC 容器将要执行事务。如果两者都操作成功,则将执行提交操作。如果任何操作失败,则将执行回滚操作。

休眠

在 Hibernate 中我们可以执行如下事务

    public int insert(Student student, Course course) 
      //it is a flag driven transaction
    boolean flag = false;
    Transaction transaction = null;
    Session session = null;
    SessionFactory sessionFactoryRepo = null;
    try 
        sessionFactoryRepo = SessionFactoryRepo.getsessionFactory();
        session = sessionFactoryRepo.openSession();
        // here we are creating the transaction object
        transaction = session.beginTransaction();

        int outcome = 0;
        outcome =session.save(student);
        if (outcome > 0) 
          // re-intialize
            outcome = 0;
            outcome = session.save(course);
        
        flag = true;
        return outcome;
     catch (Exception e) 
        // TODO: handle exception
    
    finally 
        if (flag == true) 
            transaction.commit();
         else
            transaction.rollback();
    

【讨论】:

以上是关于“Spring 事务”和“Hibernate 事务”有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

Spring对Hibernate事务管理

Hibernate 事务提交和事务回滚

在 Hibernate 事务中执行 jOOQ 语句

Hibernate基础知识整理

Hibernate-事务理解

使用 Spring @Transactional 管理 Hibernate 事务