"Spring 事务"和"Hibernate 事务"有什么区别



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

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

我也想知道@Transactional注释。

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

博士

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

长话短说:

交易

事务基本上是工作单元(即对某些内容的更改),这些工作单元作为可以提交或回滚的单个操作进行管理。Java世界中有许多不同类型的事务 - 数据库,像JMS这样的消息传递系统,应用程序间事务(对于那些不胆小的人)或任何其他可能需要包含在事务中的东西。在Java中,标准事务使用Java事务API进行管理,该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 管理代码。

编码级别尊重

春天

在春季,我们可以执行以下操作的交易

@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 容器将执行事务。如果两个操作都成功,则将执行提交操作。如果任何操作失败,则将执行回滚操作。

冬眠

在休眠中,我们可以按如下方式执行事务

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

最新更新