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

Spring事務(wù)管理的全解析

 更新時間:2026年02月11日 08:49:57   作者:NE_STOP  
在一個業(yè)務(wù)流程中,需要多條DML(insert、delete、update)語句聯(lián)合才能完成,本文介紹了Spring事務(wù)管理的各個方面,感興趣的朋友跟隨小編一起看看吧

事務(wù)支持

什么是事務(wù)?

在一個業(yè)務(wù)流程中,需要多條DML(insert、delete、update)語句聯(lián)合才能完成。這些語句必須同時成功或者同時失敗。這樣才能保證數(shù)據(jù)安全。

多條DML同時成功或者同時失敗,叫做事務(wù)。

事務(wù)處理的四個過程

  • 開啟事務(wù)
  • 執(zhí)行業(yè)務(wù)代碼
  • 提交事務(wù)(沒出現(xiàn)異常,提交成功。commit transaction)
  • 回滾事務(wù)(出現(xiàn)異常。執(zhí)行回滾事務(wù). rollback transaction)

事務(wù)的四個特性(ACID)

  • A原子性:事務(wù)是最小的工作單元,不可分
  • C一致性:事務(wù)要么同時成功,要么同時失敗
  • I隔離性:事務(wù)與事務(wù)之間保證和互不干擾
  • D持久性:持久性是事務(wù)結(jié)束的標(biāo)志。

spring對事務(wù)的支持

spring實(shí)現(xiàn)事務(wù)的2種方式:

  • 編程式事務(wù):通過編寫代碼的方式來實(shí)現(xiàn)事務(wù)管理
  • 聲明式事務(wù):基于注解方式和基于xml方式(推薦使用)

spring事務(wù)管理api

spring對事務(wù)的管理是基于aop實(shí)現(xiàn)的。所以spring專門針對事務(wù)開發(fā)了一套api,其核心接口如下:PlatformTransactionManager 接口。

聲明式事務(wù)基于注解方式實(shí)現(xiàn)

需要配置xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd" >
<!--    組件掃描-->
    <context:component-scan base-package="com.ali" />
<!--    配置數(shù)據(jù)源-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="url" value="jdbc:mysql://localhost:3306/bank"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    </bean>
<!--    配置jdbcTemplate-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>
<!--    配置事務(wù)管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
<!--    開啟事務(wù)注解驅(qū)動器,開啟事務(wù)注解,需要加上tx的命名空間-->
    <tx:annotation-driven transaction-manager="transactionManager"/>
</beans>

可以在類和方法上加@Transactional 開啟事務(wù)

  • 加在類上表示這個類上的所有方法都開啟事務(wù)
  • 加在方法方法上表示只有這個方法開啟事務(wù)

事務(wù)的傳播行為

什么是事務(wù)的傳播行為?

在service種有a()和b()2個方法,a()上有事務(wù),b()上也有事務(wù),當(dāng)a()在執(zhí)行過程中調(diào)用了b(),事務(wù)是如何傳遞的?是合并到一個事務(wù)?還是開啟一個新事務(wù)?這就是事務(wù)的傳播行為。

一共有7種傳播行為:

  • REQUIRD:支持當(dāng)前事務(wù),如果不存在就新建一個事務(wù)(默認(rèn))【沒有就新建,有就加入】
  • SUPPORTS:支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就以非事務(wù)方式執(zhí)行【有就加入,沒有就不管了】
  • MANDATORY:必須運(yùn)行在一個事務(wù)中,如果當(dāng)前沒有事務(wù)發(fā)生,將拋出異?!居芯图尤?,沒有就拋異?!?/li>
  • REQUIRES_NEW:開啟一個新事務(wù),如果一個事務(wù)已經(jīng)存在,則將這個存在的事務(wù)掛起【不管有沒有。直接開啟一個新事務(wù)。新事務(wù)和舊事務(wù)不存在嵌套關(guān)系,舊事務(wù)被掛起了】
  • NOT_SUPPORTED:以非事務(wù)方式運(yùn)行。如果有事務(wù)。則掛起當(dāng)前事務(wù)【不支持事務(wù),存在就掛起】
  • NEVER:以非事務(wù)方式運(yùn)行。如果有事務(wù)。則拋異?!静恢С质聞?wù),存在就拋異?!?/li>
  • NESTED:如果當(dāng)前有一個事務(wù)在進(jìn)行中,則該方法應(yīng)當(dāng)運(yùn)行在一個嵌套事務(wù)中。被嵌套的事務(wù)可以獨(dú)立于外層事務(wù)進(jìn)行提交或回滾。如果外層事務(wù)不存在。行為就像REQUIRD一樣【有事務(wù)的話,就在這個事務(wù)里嵌套一個完全獨(dú)立的事務(wù),嵌套的事務(wù)可以獨(dú)立的提交和回滾。沒有事務(wù)就和REQUIRD一樣】

在代碼中設(shè)置事務(wù)的傳播行為:

@Transactional(propagation = Propagation.MANDATORY)

事務(wù)隔離級別

數(shù)據(jù)庫中讀取數(shù)據(jù)存在三大問題:

  • 臟讀:讀取到?jīng)]有提交到數(shù)據(jù)庫的數(shù)據(jù)
  • 不可重復(fù)讀:在同一個事務(wù)中,第一次和第二次讀取的數(shù)據(jù)不一樣
  • 幻讀:讀到的數(shù)據(jù)是假的()

事務(wù)的隔離級別有4個:

  • 讀未提交READ_UNCOMMITTED: 存在臟讀、不可重復(fù)讀、幻讀問題
  • 讀提交READ_COMMITTED:事務(wù)提交之后才讀到。存在不可重復(fù)讀、幻讀問題
  • 可重復(fù)讀REPEATABLE_READ:解決不可重復(fù)讀的問題,存在幻讀問題
  • 序列化SERIALIZABLE:解決幻讀問題,事務(wù)排隊(duì)執(zhí)行。不支持并發(fā)。

MySQL默認(rèn)可重復(fù)讀,Oracle默認(rèn)讀提交

僅在讀的事務(wù)中設(shè)置隔離級別就行,寫的事務(wù)沒必要設(shè)置

代碼中設(shè)置事務(wù)的隔離級別:

@Transactional(isolation = Isolation.DEFAULT)

事務(wù)超時

@Transactional(timeout = 10)

以上代碼設(shè)置事務(wù)超時時間為10s

表示超過10s,如果事務(wù)中所有的DML語句還沒有執(zhí)行完畢的話,最終結(jié)果會回滾。

默認(rèn)值-1,表示沒有時間限制。

事務(wù)的超時時間值得是哪段時間?

在當(dāng)前事務(wù)中,最后一條DML語句執(zhí)行之前的時間,如果最后一條DML語句后面有很多業(yè)務(wù)邏輯,這些業(yè)務(wù)代碼執(zhí)行的時間不被計(jì)入超時時間。

只讀事務(wù)

@Transactional(readOnly = true)

將當(dāng)前事務(wù)設(shè)為只讀事務(wù),在該事務(wù)中只允許執(zhí)行select 語句。

該特性的作用是:啟動spring的優(yōu)化策略。提高select語句的執(zhí)行效率。

設(shè)置哪些異?;貪L事務(wù)

@Transactional(rollbackFor = RuntimeException.class)

表示發(fā)生RuntimeException異?;蛟摦惓5淖宇惍惓2呕貪L

設(shè)置哪些異常不回滾事務(wù)

@Transactional(noRollbackFor = NullPointerException.class)

表示發(fā)生NullPointerException異?;蛟摦惓5淖宇惒换貪L,其他異常才回滾

事務(wù)的全注解式開發(fā)

編寫配置類

@Configuration // 代替xml配置文件
@ComponentScan("com.ali") // 掃描com.ali包下的所有類
@EnableTransactionManagement // 開啟事務(wù)管理
public class Spring6Config {
    // @Bean注解用于將方法的返回值注冊為Spring容器中的一個Bean
    @Bean(name = "druidDataSource")
    public DruidDataSource druidDataSource() {
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setUrl("jdbc:mysql://localhost:3306/spring6?useSSL=false&serverTimezone=UTC");
        druidDataSource.setUsername("root");
        druidDataSource.setDriverClassName("com.mysql.jdbc.Driver");
        druidDataSource.setPassword("123456");
        return druidDataSource;
    }
    @Bean(name = "transactionManager")
    public DataSourceTransactionManager transactionManager(DataSource dataSource) {
        DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
        transactionManager.setDataSource(dataSource);
        return transactionManager;
    }
    @Bean(name = "jdbcTemplate")
    // 該方法的參數(shù)DataSource dataSource會自動從Spring容器中找到類型為DataSource的Bean并注入
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(dataSource);
        return jdbcTemplate;
    }
}

使用時和其他方式一樣。

到此這篇關(guān)于Spring事務(wù)管理的文章就介紹到這了,更多相關(guān)spring事務(wù)管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中Parser的用法

    Java中Parser的用法

    這篇文章主要介紹了Java?Parser使用指南,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • java操作hdfs的方法示例代碼

    java操作hdfs的方法示例代碼

    這篇文章主要介紹了java操作hdfs的相關(guān)資料,在本地配置Hadoop和Maven的環(huán)境變量,首先需從官網(wǎng)下載與服務(wù)器相同版本的Hadoop安裝包,配置環(huán)境變量后,引入Maven的配置文件,以便管理項(xiàng)目依賴,最后,編寫代碼實(shí)現(xiàn)對HDFS的連接和操作,完成數(shù)據(jù)的讀寫,需要的朋友可以參考下
    2022-02-02
  • Java多線程中ThreadLocal解讀

    Java多線程中ThreadLocal解讀

    這篇文章主要介紹了Java多線程中ThreadLocal解讀,??多線程訪問同一個共享變量的時候容易出現(xiàn)并發(fā)問題,因此為了保證線程安全性,我們都會采用加鎖的方式,而ThreadLocal是除加鎖方式之外的另一種保證線程安全性的方法,需要的朋友可以參考下
    2023-09-09
  • MyBatis屬性名和字段名不一致的問題解決方法

    MyBatis屬性名和字段名不一致的問題解決方法

    這篇文章給大家詳細(xì)介紹了MyBatis屬性名和字段名不一致的問題解決,文中有詳細(xì)的代碼示例和圖文展示供大家參考,對大家的學(xué)習(xí)或工作有一定的參考價值,需要的朋友可以參考下
    2023-12-12
  • Springboot整合junit過程解析

    Springboot整合junit過程解析

    這篇文章主要介紹了Springboot整合junit過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • 使用IDEA如何拉取GitLab項(xiàng)目

    使用IDEA如何拉取GitLab項(xiàng)目

    使用IDEA拉取GitLab項(xiàng)目,首先需要組長提供的socket和賬號密碼登錄內(nèi)網(wǎng)的GitLab,打開IDEA,選擇新建項(xiàng)目,選擇Project from Version Control,然后在項(xiàng)目路徑后面添加.git,以上步驟為個人操作經(jīng)驗(yàn),希望能為大家提供參考
    2024-10-10
  • Java報(bào)錯Java.net.SocketTimeoutException的幾種解決方法

    Java報(bào)錯Java.net.SocketTimeoutException的幾種解決方法

    在 Java 網(wǎng)絡(luò)編程中,SocketTimeoutException 通常表示在進(jìn)行網(wǎng)絡(luò)操作時,等待響應(yīng)的時間超過了設(shè)定的超時時間,本文將深入探討 Java.net.SocketTimeoutException 的問題,并為開發(fā)者和環(huán)境配置者提供詳細(xì)的解決方案,需要的朋友可以參考下
    2024-10-10
  • 深入淺析Netty 在 Dubbo 中是如何應(yīng)用的

    深入淺析Netty 在 Dubbo 中是如何應(yīng)用的

    國內(nèi)知名框架 Dubbo 底層使用的是 Netty 作為網(wǎng)絡(luò)通信,那么內(nèi)部到底是如何使用的呢?今天通過本文給大家詳細(xì)講解,對Netty 在 Dubbo中應(yīng)用相關(guān)知識感興趣的朋友跟隨小編一起看看吧
    2020-05-05
  • SpringBoot詳解自定義Stater的應(yīng)用

    SpringBoot詳解自定義Stater的應(yīng)用

    Springboot的出現(xiàn)極大的簡化了開發(fā)人員的配置,而這之中的一大利器便是springboot的starter,starter是springboot的核心組成部分,springboot官方同時也為開發(fā)人員封裝了各種各樣方便好用的starter模塊
    2022-07-07
  • Hibernatede 一對多映射配置方法(分享)

    Hibernatede 一對多映射配置方法(分享)

    下面小編就為大家?guī)硪黄狧ibernatede 一對多映射配置方法(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09

最新評論

尤溪县| 德江县| 阿瓦提县| 广灵县| 广灵县| 北海市| 汝南县| 苗栗市| 普宁市| 黄骅市| 北川| 嵩明县| 丹寨县| 东宁县| 洛阳市| 兴义市| 高陵县| 额尔古纳市| 双鸭山市| 城口县| 卓资县| 邹平县| 台山市| 临汾市| 新民市| 文化| 蓝田县| 曲水县| 化州市| 巨野县| 兴安盟| 申扎县| 临泽县| 兴业县| 泰安市| 泗阳县| 芦山县| 广安市| 徐州市| 来宾市| 策勒县|