亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解SpringBoot的事務(wù)管理

 更新時(shí)間:2017年04月10日 11:07:18   投稿:mrr  
Springboot內(nèi)部提供的事務(wù)管理器是根據(jù)autoconfigure來(lái)進(jìn)行決定的。接下來(lái)通過(guò)本文給大家介紹SpringBoot的事務(wù)管理相關(guān)知識(shí),感興趣的朋友一起學(xué)習(xí)吧

Springboot內(nèi)部提供的事務(wù)管理器是根據(jù)autoconfigure來(lái)進(jìn)行決定的。

比如當(dāng)使用jpa的時(shí)候,也就是pom中加入了spring-boot-starter-data-jpa這個(gè)starter之后。

Springboot會(huì)構(gòu)造一個(gè)JpaTransactionManager這個(gè)事務(wù)管理器。

而當(dāng)我們使用spring-boot-starter-jdbc的時(shí)候,構(gòu)造的事務(wù)管理器則是DataSourceTransactionManager。

這2個(gè)事務(wù)管理器都實(shí)現(xiàn)了spring中提供的PlatformTransactionManager接口,這個(gè)接口是spring的事務(wù)核心接口。

這個(gè)核心接口有以下這幾個(gè)常用的實(shí)現(xiàn)策略:

HibernateTransactionManager
DataSourceTransactionManager
JtaTransactionManager
JpaTransactionManager

具體的PlatformTransactionManager繼承關(guān)系如下:

spring-boot-starter-data-jpa這個(gè)starter會(huì)觸發(fā)HibernateJpaAutoConfiguration這個(gè)自動(dòng)化配置類,HibernateJpaAutoConfiguration繼承了JpaBaseConfiguration基礎(chǔ)類。

在JpaBaseConfiguration中構(gòu)造了事務(wù)管理器:

@Bean
@ConditionalOnMissingBean(PlatformTransactionManager.class)
public PlatformTransactionManager transactionManager() {
return new JpaTransactionManager();
}

spring-boot-starter-jdbc會(huì)觸發(fā)DataSourceTransactionManagerAutoConfiguration這個(gè)自動(dòng)化配置類,也會(huì)構(gòu)造事務(wù)管理器:

@Bean
@ConditionalOnMissingBean(PlatformTransactionManager.class)
@ConditionalOnBean(DataSource.class)
public DataSourceTransactionManager transactionManager() {
return new DataSourceTransactionManager(this.dataSource);
}

Spring的事務(wù)管理器PlatformTransactionManager接口中定義了3個(gè)方法:

// 基于事務(wù)的傳播特性,返回一個(gè)已經(jīng)存在的事務(wù)或者創(chuàng)建一個(gè)新的事務(wù)
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
// 提交事務(wù)
void commit(TransactionStatus status) throws TransactionException;
// 回滾事務(wù)
void rollback(TransactionStatus status) throws TransactionException;

其中TransactionDefinition接口表示跟spring兼容的事務(wù)屬性,比如傳播行為、隔離級(jí)別、超時(shí)時(shí)間、是否只讀等屬性。

DefaultTransactionDefinition類是一個(gè)默認(rèn)的TransactionDefinition實(shí)現(xiàn),它的傳播行為是PROPAGATION_REQUIRED(如果當(dāng)前沒(méi)事務(wù),則創(chuàng)建一個(gè),否則加入到當(dāng)前事務(wù)中),隔離級(jí)別是數(shù)據(jù)庫(kù)默認(rèn)級(jí)別。

TransactionStatus接口表示事務(wù)的狀態(tài),比如事務(wù)是否是一個(gè)剛構(gòu)造的事務(wù)、事務(wù)是否已經(jīng)完成等狀態(tài)。

下面這段代碼就是傳統(tǒng)事務(wù)的常見(jiàn)寫法:

transaction.begin();
try {
...
transaction.commit();
} catch(Exception e) {
...
transaction.rollback();
} finally {
}

由于spring的事務(wù)操作被封裝到了PlatformTransactionManager接口中,commit和rollback方法對(duì)應(yīng)接口中的方法,begin方法在getTransaction方法中會(huì)被調(diào)用。

細(xì)心的讀者發(fā)現(xiàn)文章前面構(gòu)造事務(wù)管理器的時(shí)候都會(huì)加上這段注解:

@ConditionalOnMissingBean(PlatformTransactionManager.class)

也就是說(shuō)如果我們手動(dòng)配置了事務(wù)管理器,Springboot就不會(huì)再為我們自動(dòng)配置事務(wù)管理器。

如果要使用多個(gè)事務(wù)管理器的話,那么需要手動(dòng)配置多個(gè):

@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注解的時(shí)候需要聲明是哪個(gè)事務(wù)管理器:

@Transactional(value="transactionManager1")
public void save() {
doSave();
}

Spring給我們提供了一個(gè)TransactionManagementConfigurer接口,該接口只有一個(gè)方法返回PlatformTransactionManager。其中返回的PlatformTransactionManager就表示這是默認(rèn)的事務(wù)處理器,這樣在Transactional注解上就不需要聲明是使用哪個(gè)事務(wù)管理器了。

參考閱讀:

Spring Boot 快速入門指南

Spring Boot 快速入門教程

以上所述是小編給大家介紹的SpringBoot的事務(wù)管理,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Java中常見(jiàn)延時(shí)隊(duì)列的實(shí)現(xiàn)方案小結(jié)(建議收藏)

    Java中常見(jiàn)延時(shí)隊(duì)列的實(shí)現(xiàn)方案小結(jié)(建議收藏)

    延時(shí)隊(duì)列它要具有隊(duì)列的特性,再給它附加一個(gè)延遲消費(fèi)隊(duì)列消息的功能,也就是說(shuō)可以指定隊(duì)列中的消息在哪個(gè)時(shí)間點(diǎn)被消費(fèi),這篇文章主要介紹了Java中常見(jiàn)延時(shí)隊(duì)列的實(shí)現(xiàn)方案總結(jié),需要的朋友可以參考下
    2024-04-04
  • Java實(shí)現(xiàn)合并多個(gè)PDF的示例代碼

    Java實(shí)現(xiàn)合并多個(gè)PDF的示例代碼

    這篇文章主要介紹了通過(guò)Java實(shí)現(xiàn)合并多個(gè)PDF,并將合并后的新PDF存儲(chǔ)到文件夾下,文中的示例代碼簡(jiǎn)潔易懂,感興趣的可以跟隨小編一起試一試
    2022-01-01
  • SpringBoot集成geodesy實(shí)現(xiàn)距離計(jì)算功能

    SpringBoot集成geodesy實(shí)現(xiàn)距離計(jì)算功能

    Geodesy:大地測(cè)量學(xué)的神奇力量 Geodesy,又稱大地測(cè)量學(xué),是一門研究地球形狀、大小及其重力場(chǎng)的學(xué)科,在地球距離計(jì)算中,它扮演著至關(guān)重要的角色,故本文給大家介紹了SpringBoot集成geodesy實(shí)現(xiàn)距離計(jì)算功能,感興趣的朋友可以參考下
    2024-06-06
  • 學(xué)習(xí)Java之如何對(duì)時(shí)間進(jìn)行格式化

    學(xué)習(xí)Java之如何對(duì)時(shí)間進(jìn)行格式化

    當(dāng)我們?cè)谀J(rèn)情況下構(gòu)造出來(lái)的時(shí)間對(duì)象,它的時(shí)間格式并不適合我們閱讀,并且在開發(fā)時(shí),pc端、Android端、iOS端等展示的時(shí)間格式可能也并不完全一樣,本文就從這幾個(gè)問(wèn)題給大家介紹如何對(duì)時(shí)間進(jìn)行格式化,感興趣的同學(xué)可以借鑒一下
    2023-05-05
  • Spring?Boot?整合?Reactor實(shí)例詳解

    Spring?Boot?整合?Reactor實(shí)例詳解

    這篇文章主要為大家介紹了Spring?Boot?整合?Reactor實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Java 定時(shí)器的多種實(shí)現(xiàn)方式

    Java 定時(shí)器的多種實(shí)現(xiàn)方式

    本文介紹了Java中定時(shí)器的多種實(shí)現(xiàn)方式,有此需求的朋友可以根據(jù)實(shí)際選擇適合自己的方式
    2021-06-06
  • Java中對(duì)象的比較操作實(shí)例分析

    Java中對(duì)象的比較操作實(shí)例分析

    這篇文章主要介紹了Java中對(duì)象的比較操作,結(jié)合實(shí)例形式分析了java對(duì)象比較操作實(shí)現(xiàn)方法與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-08-08
  • 密碼系統(tǒng)AES私鑰RSA公鑰的加解密示例

    密碼系統(tǒng)AES私鑰RSA公鑰的加解密示例

    這篇文章主要為大家詮釋并介紹了AES私鑰RSA公鑰的加解密系統(tǒng)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • Java標(biāo)識(shí)接口的使用方法

    Java標(biāo)識(shí)接口的使用方法

    在本篇文章中小編給大家分享了關(guān)于Java標(biāo)識(shí)接口的使用方法和教程內(nèi)容,有需要的朋友們學(xué)習(xí)下。
    2019-01-01
  • MyBatis別名和settings設(shè)置方式

    MyBatis別名和settings設(shè)置方式

    這篇文章主要介紹了MyBatis別名和settings設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評(píng)論