簡體   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