最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot中的聲明式事務(wù)+切面事務(wù)+編程式事務(wù)詳解

 更新時間:2023年08月18日 09:28:06   作者:依嘫_吃代碼  
這篇文章主要介紹了SpringBoot中的聲明式事務(wù)+切面事務(wù)+編程式事務(wù)詳解,事務(wù)管理對于企業(yè)應(yīng)用來說是至關(guān)重要的,當(dāng)出現(xiàn)異常情況時,它也可以保證數(shù)據(jù)的一致性,需要的朋友可以參考下

前言

事務(wù)管理對于企業(yè)應(yīng)用來說是至關(guān)重要的,當(dāng)出現(xiàn)異常情況時,它也可以保證數(shù)據(jù)的一致性。

springBoot中兩種事務(wù)的實現(xiàn)方式,編程式事務(wù)配置和聲明式事務(wù)配置還有切面事務(wù) 還有以后的分布式事務(wù)

一、事務(wù)特性

在這里插入圖片描述

  • 原子性(Atomicity):
    • 事務(wù)是一個原子操作,由一系列動作組成。事務(wù)的原子性確保動作要么全部完成,要么完全不起作用;
  • 一致性(Consistency):
    • 一旦事務(wù)完成(不管是成功還是失?。到y(tǒng)必須確保它所建模的業(yè)務(wù)處于一致的狀態(tài),而不會是部分完成部分失敗。在現(xiàn)實中的數(shù)據(jù)不應(yīng)該被破壞;
  • 隔離性(Isolation):
    • 可能有許多事務(wù)會同時處理相同的數(shù)據(jù),因此每個事務(wù)都應(yīng)該與其他事務(wù)隔離開來,防止數(shù)據(jù)損壞;
  • 持久性(Durability):
    • 一旦事務(wù)完成,無論發(fā)生什么系統(tǒng)錯誤,它的結(jié)果都不應(yīng)該受到影響,這樣就能從任何系統(tǒng)崩潰中恢復(fù)過來。通常情況下,事務(wù)的結(jié)果被寫到持久化存儲器中;

Spring 框架中,涉及到事務(wù)管理的 API 大約有100個左右,其中最重要的有三個: TransactionDefinition、PlatformTransactionManager、TransactionStatus 。

所謂事務(wù)管理,其實就是”按照給定的事務(wù)規(guī)則來執(zhí)行提交或者回滾操作”。”

給定的事務(wù)規(guī)則”就是用 TransactionDefinition 表示的,”按照……來執(zhí)行提交或者回滾操作”便是用 PlatformTransactionManager 來表示

而 TransactionStatus 用于表示一個運行著的事務(wù)的狀態(tài)。

打一個不恰當(dāng)?shù)谋扔?,TransactionDefinition 與 TransactionStatus 的關(guān)系就像程序和進(jìn)程的關(guān)系。

開啟事務(wù) @EnableTransactionManagement

二、事務(wù)的隔離級別

和數(shù)據(jù)庫中的事務(wù)級別是一樣的 都會出現(xiàn)事務(wù)本身應(yīng)該有的問題

在這里插入圖片描述

三、事務(wù)的傳播行為

在這里插入圖片描述

四、 Springboot事務(wù)

1.Springboot聲明式事務(wù)

聲明式事務(wù)是建立在AOP之上的。

其本質(zhì)是對方法前后進(jìn)行攔截,然后在目標(biāo)方法開始之前創(chuàng)建或者加入一個事務(wù),在執(zhí)行完目標(biāo)方法之后根據(jù)執(zhí)行情況提交或者回滾事務(wù)。

Spring配置文件中關(guān)于事務(wù)配置總是由三個組成部分,分別是DataSource、TransactionManager和代理機(jī)制這三部分,無論哪種配置方式,一般變化的只是代理機(jī)制這部分。

DataSource、TransactionManager這兩部分只是會根據(jù)數(shù)據(jù)訪問方式有所變化,比如使用Hibernate進(jìn)行數(shù)據(jù)訪問時,DataSource實際為SessionFactory,TransactionManager的實現(xiàn)為HibernateTransactionManager。

根據(jù)代理機(jī)制的不同,總結(jié)了五種Spring事務(wù)的配置方式,如下圖:

在這里插入圖片描述

聲明式事務(wù)@Transactional可以使用在類上,也可以使用在public方法上

如果是使用在類上,則是對所有的public方法都開啟事務(wù),如果類和方法上都有則方法上的事務(wù)生效

在類上

@Transactional(rollbackFor=Exception.class)
public class TransactionServiceImpl implements TransactionService {
}

在方法上

@Override
@Transactional(rollbackFor=Exception.class)
public void t1(Student one) {
}

聲明式事務(wù)最大的優(yōu)點就是不需要通過編程的方式管理事務(wù),這樣就不需要在業(yè)務(wù)邏輯代碼中摻雜事務(wù)管理的代碼,只需在配置文件中做相關(guān)的事務(wù)規(guī)則聲明(或通過基于@Transactional注解的方式),便可以將事務(wù)規(guī)則應(yīng)用到業(yè)務(wù)邏輯中。

優(yōu)點:

編程式事務(wù)每次實現(xiàn)都要單獨實現(xiàn),但業(yè)務(wù)量大且功能復(fù)雜時,使用編程性事務(wù)無疑是痛苦的;而聲明式事務(wù)不同,聲明式事務(wù)屬于非侵入性,不會影響業(yè)務(wù)邏輯的實現(xiàn),只需在配置文件中做相關(guān)的事務(wù)規(guī)則聲明(或通過基于@Transactional注解的方式),便可以將事務(wù)規(guī)則應(yīng)用到業(yè)務(wù)邏輯中;

非侵入式的開發(fā)方式,聲明式事務(wù)管理使業(yè)務(wù)代碼不受污染,一個普通的POJO對象,只要加上注解就可以獲得完全的事務(wù)支持;

缺點:

最細(xì)粒度只能是作用到方法級別,無法做到像編程事務(wù)那樣可以作用到代碼塊級別;

實現(xiàn)方式:

使用攔截器:基于TransactionInterceptor 類來實施聲明式事務(wù)管理功能(Spring最初提供的實現(xiàn)方式);

Bean和代理:基于 TransactionProxyFactoryBean的聲明式事務(wù)管理

使用tx標(biāo)簽配置的攔截器:基于tx和aop名字空間的xml配置文件(基于Aspectj AOP配置事務(wù)); 全注解:基于@Transactional注解;

@Transactional的參數(shù)

在這里插入圖片描述

聲明式事務(wù)的約定流程:

首先Spring通過事務(wù)管理器(PlatformTransactionManager的子類)創(chuàng)建事務(wù),與此同時會把事務(wù)定義中的隔離級別、超時時間等屬性根據(jù)配置內(nèi)容往事務(wù)上設(shè)置。

而根據(jù)傳播行為配置采取一種特定的策略,后面會談到傳播行為的使用問題,這是Spring根據(jù)配置完成的內(nèi)容,你只需要配置,無須編碼。

然后,啟動開發(fā)者提供的業(yè)務(wù)代碼,我們知道Spring會通過反射的方式調(diào)度開發(fā)者的業(yè)務(wù)代碼,但是反射的結(jié)果可能是正常返回或者產(chǎn)生異常返回,那么它給的約定是只要發(fā)生異常,并且符合事務(wù)定義類回滾條件的,Spring就會將數(shù)據(jù)庫事務(wù)回滾,否則將數(shù)據(jù)庫事務(wù)提交,這也是Spring自己完成的   

在這里插入圖片描述

顯然聲明式事務(wù)管理要優(yōu)于編程式事務(wù)管理,這正是spring倡導(dǎo)的非侵入式的開發(fā)方式。

聲明式事務(wù)管理使業(yè)務(wù)代碼不受污染,一個普通的POJO對象,只要加上注解就可以獲得完全的事務(wù)支持。和編程式事務(wù)相比,聲明式事務(wù)唯一不足地方是,它的最細(xì)粒度只能作用到方法級別,無法做到像編程式事務(wù)那樣可以作用到代碼塊級別。

但是即便有這樣的需求,也存在很多變通的方法,比如,可以將需要進(jìn)行事務(wù)管理的代碼塊獨立為方法等等。

聲明式事務(wù)管理也有兩種常用的方式,一種是基于tx和aop名字空間的xml配置文件,另一種就是基于@Transactional注解。

顯然基于注解的方式更簡單易用,更清爽。

2. Springboot編程式事務(wù)

編程式事務(wù): 是侵入性事務(wù)管理,直接使用底層的PlatformTransactionManager、使用TransactionTemplate(Spring推薦使用);

編程式事務(wù)管理對基于 POJO 的應(yīng)用來說是唯一選擇。

我們需要在代碼中調(diào)用beginTransaction()、commit()、rollback()等事務(wù)管理相關(guān)的方法;

@Autowired 
private TransactionTemplate transactionTemplate;
@Override
  public final void save2() {
   transactionTemplate.execute((status)->{
            mapper.saveStudent(newOne());
            mapper.saveStudent(newOne());
            return Boolean.TRUE;
        });
  }

這樣兩個mapper.saveStudent(newOne());就在一個事務(wù)中執(zhí)行了

3.SpringBoo切面編程式事務(wù)

SpringBoo切面編程式事務(wù)應(yīng)該是聲明式事務(wù)的一種具體體現(xiàn) 此種方式基于AOP功能,所以需要添加

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

配置類

@Aspect
@Configuration
public class MyTransactionConfig {
    /**
     * 配置方法過期時間,默認(rèn)-1,永不超時
     */
    private final static int TX_METHOD_TIME_OUT = 10;
   /**
     * 全局事務(wù)位置配置 在哪些地方需要進(jìn)行事務(wù)處理
     * 配置切入點表達(dá)式
     */
    private static final String POITCUT_EXPRESSION = "execution(* zdc.enterprise.service.impl.*.*(..))";
    @Autowired
    private PlatformTransactionManager platformTransactionManager;
    @Bean
    public TransactionInterceptor txadvice() {
        /*只讀事物、不做更新刪除等*/
        /*事務(wù)管理規(guī)則*/
        RuleBasedTransactionAttribute readOnlyRule = new RuleBasedTransactionAttribute();
        /*設(shè)置當(dāng)前事務(wù)是否為只讀事務(wù),true為只讀*/
        readOnlyRule.setReadOnly(true);
        /* transactiondefinition 定義事務(wù)的隔離級別;
         *如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則以非事務(wù)的方式繼續(xù)運行。*/
        readOnlyRule.setPropagationBehavior(TransactionDefinition.PROPAGATION_SUPPORTS);
         /*增刪改事務(wù)規(guī)則*/
        RuleBasedTransactionAttribute requireRule = new RuleBasedTransactionAttribute();
        /*拋出異常后執(zhí)行切點回滾 建議自定義異常*/
        requireRule.setRollbackRules(Collections.singletonList(new RollbackRuleAttribute(Exception.class)));
        /*PROPAGATION_REQUIRED:事務(wù)隔離性為1,若當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則創(chuàng)建一個新的事務(wù)。這是默認(rèn)值。 */
        requireRule.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        /*設(shè)置事務(wù)失效時間,超過10秒*/
        requireRule.setTimeout(TX_METHOD_TIME_OUT);
        /** 配置事務(wù)管理規(guī)則
         nameMap聲明具備需要管理事務(wù)的方法名.
         這里使用addTransactionalMethod  使用setNameMap
         */
        Map<String, TransactionAttribute> nameMap = new HashMap<>();
        nameMap.put("add*", requireRule);
        nameMap.put("save*", requireRule);
        nameMap.put("insert*", requireRule);
        nameMap.put("update*", requireRule);
        nameMap.put("delete*", requireRule);
        nameMap.put("remove*", requireRule);
        /*進(jìn)行批量操作時*/
        nameMap.put("batch*", requireRule);
        nameMap.put("get*", readOnlyRule);
        nameMap.put("query*", readOnlyRule);
        nameMap.put("find*", readOnlyRule);
        nameMap.put("select*", readOnlyRule);
        nameMap.put("count*", readOnlyRule);
        NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();
        source.setNameMap(nameMap);
        TransactionInterceptor transactionInterceptor = new TransactionInterceptor(platformTransactionManager, source);
        return transactionInterceptor;
    }
    /**
     * 設(shè)置切面=切點pointcut+通知TxAdvice
     * @return
     */
    @Bean
    public Advisor txAdviceAdvisor() {
        AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
        pointcut.setExpression(POITCUT_EXPRESSION);
        return new DefaultPointcutAdvisor(pointcut, txadvice());
    }
}

有了這個切面配置類,就不要用在類或者每個方法上使用@Transactional了,當(dāng)然方法名前綴要能和設(shè)置的匹配上

RuleBasedTransactionAttribute的參數(shù)大致和@Transactional的參數(shù)相同,里面有詳細(xì)的注釋,就不過多解釋了

到此這篇關(guān)于SpringBoot中的聲明式事務(wù)+切面事務(wù)+編程式事務(wù)詳解的文章就介紹到這了,更多相關(guān)SpringBoot各類型事務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java讀取excel圖片導(dǎo)入代碼示例(親測有效)

    java讀取excel圖片導(dǎo)入代碼示例(親測有效)

    在日常工作中,我們經(jīng)常要將一些照片插入到Excel表格中,這篇文章主要給大家介紹了關(guān)于java讀取excel圖片導(dǎo)入的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • Java 守護(hù)線程_動力節(jié)點Java學(xué)院整理

    Java 守護(hù)線程_動力節(jié)點Java學(xué)院整理

    Java語言機(jī)制是構(gòu)建在JVM的基礎(chǔ)之上的,意思是Java平臺把操作系統(tǒng)的底層給屏蔽起來,所以它可以在它自己的虛擬的平臺里面構(gòu)造出對自己有利的機(jī)制,而語言或者說平臺的設(shè)計者多多少少是收到Unix思想的影響,而守護(hù)線程機(jī)制又是對JVM這樣的平臺湊合,于是守護(hù)線程應(yīng)運而生
    2017-05-05
  • Java線程讓步_動力節(jié)點Java學(xué)院整理

    Java線程讓步_動力節(jié)點Java學(xué)院整理

    yield()的作用是讓步。它能讓當(dāng)前線程由“運行狀態(tài)”進(jìn)入到“就緒狀態(tài)”,從而讓其它具有相同優(yōu)先級的等待線程獲取執(zhí)行權(quán)。下面通過本文給大家介紹Java線程讓步的相關(guān)知識,需要的朋友參考下吧
    2017-05-05
  • 一篇文章帶你解決 IDEA 每次新建項目 maven home directory 總是改變的問題

    一篇文章帶你解決 IDEA 每次新建項目 maven home directory 總是改變的問題

    這篇文章主要介紹了一篇文章帶你解決 IDEA 每次新建項目 maven home directory 總是改變的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Java實現(xiàn)圖片模糊效果詳解

    Java實現(xiàn)圖片模糊效果詳解

    圖片模糊是圖像處理中的一種常見效果,它通過平均周圍像素的顏色來使圖像變得模糊,下面我們來看看如何使用Swing庫實現(xiàn)圖片模糊效果吧
    2025-02-02
  • 如何使用 Shell 腳本查看多個服務(wù)器的端口是否打開的方法

    如何使用 Shell 腳本查看多個服務(wù)器的端口是否打開的方法

    這篇文章主要介紹了如何使用 Shell 腳本來查看多個服務(wù)器的端口是否打開的方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • Java實現(xiàn)對象排序的兩種方式詳解

    Java實現(xiàn)對象排序的兩種方式詳解

    這篇文章主要介紹了Java實現(xiàn)對象排序的兩種方式詳解,在Java中經(jīng)常會涉及到對象數(shù)組的排序問題,則就提到對象之間的比較問題,今天我們就來看一下兩種不同排序方式之間的區(qū)別,需要的朋友可以參考下
    2023-09-09
  • 詳解Java List的擴(kuò)容機(jī)制原理及應(yīng)用

    詳解Java List的擴(kuò)容機(jī)制原理及應(yīng)用

    在Java中,List是一種非常常用的數(shù)據(jù)結(jié)構(gòu),用于存儲有序的元素集合,本文將分析Java List的擴(kuò)容機(jī)制原理,并通過示例代碼和測試代碼來加強(qiáng)闡述內(nèi)容,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • springmvc 防止表單重復(fù)提交的兩種方法

    springmvc 防止表單重復(fù)提交的兩種方法

    最近在本地開發(fā)測試的時候,遇到一個表單重復(fù)提交的現(xiàn)象。本文主要介紹了springmvc 防止表單重復(fù)提交的兩種方法,感興趣的可以了解一下
    2021-08-08
  • Java啟用Azure Linux虛擬機(jī)診斷設(shè)置

    Java啟用Azure Linux虛擬機(jī)診斷設(shè)置

    這篇文章主要介紹了Java啟用Azure Linux虛擬機(jī)診斷設(shè)置,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05

最新評論

堆龙德庆县| 乌兰县| 泸州市| 昌邑市| 富源县| 平和县| 长岭县| 高清| 和平县| 台北县| 鄢陵县| 延庆县| 紫阳县| 沧源| 道真| 武清区| 资阳市| 民权县| 灵宝市| 崇信县| 罗甸县| 天峨县| 潼南县| 汝州市| 吉安县| 滨州市| 沽源县| 横峰县| 佛学| 张家口市| 军事| 册亨县| 星子县| 循化| 体育| 辽源市| 堆龙德庆县| 稷山县| 榆林市| 顺平县| 育儿|