91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

一文帶你讀懂SpringBoot中的事務管理

發布時間:2020-11-16 16:30:58 來源:億速云 閱讀:467 作者:Leah 欄目:編程語言

一文帶你讀懂SpringBoot中的事務管理?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

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

比如當使用jpa的時候,也就是pom中加入了spring-boot-starter-data-jpa這個starter之后。

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

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

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

這個核心接口有以下這幾個常用的實現策略:

HibernateTransactionManager
DataSourceTransactionManager
JtaTransactionManager
JpaTransactionManager

具體的PlatformTransactionManager繼承關系如下:

一文帶你讀懂SpringBoot中的事務管理

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注解上就不需要聲明是使用哪個事務管理器了。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

嘉鱼县| 苏州市| 灵璧县| 司法| 丹巴县| 庆城县| 拉萨市| 南岸区| 马鞍山市| 长武县| 桐庐县| 千阳县| 张家港市| 康马县| 柘荣县| 吴忠市| 五原县| 永新县| 丰都县| 攀枝花市| 丰台区| 新绛县| 西乌珠穆沁旗| 元阳县| 仲巴县| 龙里县| 海丰县| 英山县| 芜湖县| 娄烦县| 玉田县| 台中县| 紫金县| 杭锦后旗| 石楼县| 广西| 广州市| 邢台县| 独山县| 阿巴嘎旗| 峨眉山市|