繁体   English   中英

“Spring 事务”和“Hibernate 事务”有什么区别

[英]What is the difference between a “Spring transaction” and a “Hibernate transaction”

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

  1. 休眠事务
  2. 春季交易

我也想知道@Transactional注释。

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

TL; 博士

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

长长的故事:

交易

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

休眠

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

春天

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

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

@Transactional

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

所以基本上@Transactional发生的事情是,在运行时 spring 扫描您的代码库以查找 @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 管理代码。

编码级别差异

春天

在 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容器就要执行事务了。 如果两个操作都成功,那么commit操作就会被执行。 如果任何操作失败,则将执行回滚操作。

休眠

在 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();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM