SpringBoot 的事務管理

Springboot內部提供的事務管理器是根據autoconfigure來進行決定的。spring

 

好比當使用jpa的時候,也就是pom中加入了spring-boot-starter-data-jpa這個starter以後。數據庫

 

Springboot會構造一個JpaTransactionManager這個事務管理器。spring-boot

 

而當咱們使用spring-boot-starter-jdbc的時候,構造的事務管理器則是DataSourceTransactionManager。this

 

這2個事務管理器都實現了spring中提供的PlatformTransactionManager接口,這個接口是spring的事務核心接口。spa

 

這個核心接口有如下這幾個經常使用的實現策略:.net

 

  1. HibernateTransactionManagerorm

  2. DataSourceTransactionManager繼承

  3. JtaTransactionManager接口

  4. JpaTransactionManager事務

 

spring-boot-starter-data-jpa這個starter會觸發HibernateJpaAutoConfiguration這個自動化配置類,HibernateJpaAutoConfiguration繼承了JpaBaseConfiguration基礎類。

 

在JpaBaseConfiguration中構造了事務管理器:

 

@Bean

@ConditionalOnMissingBean(PlatformTransactionManager.class)

public PlatformTransactionManager transactionManager() {

    return new JpaTransactionManager();

}

 

spring-boot-starter-jdbc會觸發DataSourceTransactionManagerAutoConfiguration這個自動化配置類,也會構造事務管理器:

 

@Bean

@ConditionalOnMissingBean(PlatformTransactionManager.class)

@ConditionalOnBean(DataSource.class)

public DataSourceTransactionManager transactionManager() {

    return new DataSourceTransactionManager(this.dataSource);

}

 

Spring的事務管理器PlatformTransactionManager接口中定義了3個方法:

 

// 基於事務的傳播特性,返回一個已經存在的事務或者建立一個新的事務

TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;

 

// 提交事務

void commit(TransactionStatus status) throws TransactionException;

 

// 回滾事務

void rollback(TransactionStatus status) throws TransactionException;

 

其中TransactionDefinition接口表示跟spring兼容的事務屬性,好比傳播行爲、隔離級別、超時時間、是否只讀等屬性。

 

DefaultTransactionDefinition類是一個默認的TransactionDefinition實現,它的傳播行爲是PROPAGATION_REQUIRED(若是當前沒事務,則建立一個,不然加入到當前事務中),隔離級別是數據庫默認級別。

 

TransactionStatus接口表示事務的狀態,好比事務是不是一個剛構造的事務、事務是否已經完成等狀態。

 

下面這段代碼就是傳統事務的常見寫法:

 

transaction.begin();

try {

    ...

    transaction.commit();

} catch(Exception e) {

    ...

    transaction.rollback();

} finally {

 

}

 

因爲spring的事務操做被封裝到了PlatformTransactionManager接口中,commit和rollback方法對應接口中的方法,begin方法在getTransaction方法中會被調用。

 

細心的讀者發現文章前面構造事務管理器的時候都會加上這段註解:

 

@ConditionalOnMissingBean(PlatformTransactionManager.class)

 

也就是說若是咱們手動配置了事務管理器,Springboot就不會再爲咱們自動配置事務管理器。

 

若是要使用多個事務管理器的話,那麼須要手動配置多個:

 

@Configuration

public class DatabaseConfiguration {

 

    @Bean

    public PlatformTransactionManager transactionManager1(EntityManagerFactory entityManagerFactory) {

        return new JpaTransactionManager(entityManagerFactory);

    }

 

    @Bean

    public PlatformTransactionManager transactionManager2(DataSource dataSource) {

        return new DataSourceTransactionManager(dataSource);

    }

 

}

 

而後使用Transactional註解的時候須要聲明是哪一個事務管理器:

 

@Transactional(value="transactionManager1")

public void save() {

    doSave();

}

 

Spring給咱們提供了一個TransactionManagementConfigurer接口,該接口只有一個方法返回PlatformTransactionManager。其中返回的PlatformTransactionManager就表示這是默認的事務處理器,這樣在Transactional註解上就不須要聲明是使用哪一個事務管理器了。

相關文章
相關標籤/搜索