“春季交易”和“休眠交易”有什么区别

2022-09-01 10:44:10

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

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

我也想知道注释。@Transactional


答案 1

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

TL;DR

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

长话短说:

交易

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

冬眠

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

春天

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

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

@Transactional

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

因此,基本上发生的事情是,在运行时,spring会扫描您的代码库以查找@Transactional类和方法,并根据您通过注释配置的内容将它们包装在特定于事务的管理代码中。所以像这样的方法:@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

编码级服从

春天

在春季,我们可以执行如下交易

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

推荐