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

SpringBoot中的手動(dòng)提交事務(wù)

 更新時(shí)間:2024年09月29日 10:11:42   作者:愛碼猿  
在Spring框架中使用@Transactional注解通常管理事務(wù),但在多線程環(huán)境下此方法失效,本文討論了手動(dòng)事務(wù)的必要性及其實(shí)現(xiàn)方式,探討了Spring的七種事務(wù)傳播行為和數(shù)據(jù)庫的四大特性與隔離級(jí)別,了解這些可以幫助開發(fā)者在無法使用聲明式事務(wù)時(shí)

今天在工作中遇到了一個(gè)spring事務(wù)的問題:

在service方法內(nèi)需要通過線程去執(zhí)行添加用戶積分和用戶積分日志的情況,試了下通過@Transactional聲明式事務(wù)不起作用,只能使用手動(dòng)事務(wù)去控制

因此寫了這篇博客,記錄一下這個(gè)情況

一、事務(wù)的重要性

相信在實(shí)際開發(fā)過程中,都有很深的了解了。

但是存在一個(gè)問題我們經(jīng)常在開發(fā)的時(shí)候一般情況下都是用的注解的方式來進(jìn)行事務(wù)的控制,說白了基于spring的7種事務(wù)控制方式來進(jìn)行事務(wù)的之間的協(xié)調(diào)。

二、spring的7中事務(wù)傳播行為

Propagation.REQUIRED代表當(dāng)前方法支持當(dāng)前的事務(wù),且與調(diào)用者處于同一事務(wù)上下文中,回滾統(tǒng)一回滾(如果當(dāng)前方法是被其他方法調(diào)用的時(shí)候,且調(diào)用者本身即有事務(wù)),如果沒有事務(wù),則自己新建事務(wù),
Propagation.SUPPORTS代表當(dāng)前方法支持當(dāng)前的事務(wù),且與調(diào)用者處于同一事務(wù)上下文中,回滾統(tǒng)一回滾(如果當(dāng)前方法是被其他方法調(diào)用的時(shí)候,且調(diào)用者本身即有事務(wù)),如果沒有事務(wù),則該方法在非事務(wù)的上下文中執(zhí)行
Propagation.MANDATORY代表當(dāng)前方法支持當(dāng)前的事務(wù),且與調(diào)用者處于同一事務(wù)上下文中,回滾統(tǒng)一回滾(如果當(dāng)前方法是被其他方法調(diào)用的時(shí)候,且調(diào)用者本身即有事務(wù)),如果沒有事務(wù),則拋出異常
Propagation.REQUIRES_NEW創(chuàng)建一個(gè)新的事務(wù)上下文,如果當(dāng)前方法的調(diào)用者已經(jīng)有了事務(wù),則掛起調(diào)用者的事務(wù),這兩個(gè)事務(wù)不處于同一上下文,如果各自發(fā)生異常,各自回滾
Propagation.NOT_SUPPORTED該方法以非事務(wù)的狀態(tài)執(zhí)行,如果調(diào)用該方法的調(diào)用者有事務(wù)則先掛起調(diào)用者的事務(wù)
Propagation.NEVER該方法以非事務(wù)的狀態(tài)執(zhí)行,如果調(diào)用者存在事務(wù),則拋出異常
Propagation.NESTED如果當(dāng)前上下文中存在事務(wù),則以嵌套事務(wù)執(zhí)行該方法,也就說,這部分方法是外部方法的一部分,調(diào)用者回滾,則該方法回滾,但如果該方法自己發(fā)生異常,則自己回滾,不會(huì)影響外部事務(wù),如果不存在事務(wù),則與PROPAGATION_REQUIRED一樣

三、數(shù)據(jù)庫四大特性和MySQL事務(wù)的隔離級(jí)別

1)四大特性

a、原子性(Atomicity)  

原子性是指事務(wù)包含的所有操作要么全部成功,要么全部失敗回滾。

b、 一致性(Consistency)  

一致性是指事務(wù)必須使數(shù)據(jù)庫從一個(gè)一致性狀態(tài)變換到另一個(gè)一致性狀態(tài),也就是說一個(gè)事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)。

c、隔離性(Isolation)  

隔離性是當(dāng)多個(gè)用戶并發(fā)訪問數(shù)據(jù)庫時(shí),比如操作同一張表時(shí),數(shù)據(jù)庫為每一個(gè)用戶開啟的事務(wù),不能被其他事務(wù)的操作所干擾,多個(gè)并發(fā)事務(wù)之間要相互隔離。

d、 持久性(Durability)  

持久性是指一個(gè)事務(wù)一旦被提交了,那么對(duì)數(shù)據(jù)庫中的數(shù)據(jù)的改變就是永久性的,即便是在數(shù)據(jù)庫系統(tǒng)遇到故障的情況下也不會(huì)丟失提交事務(wù)的操作。

2)隔離級(jí)別

a、臟讀是指在一個(gè)事務(wù)處理過程里讀取了另一個(gè)未提交的事務(wù)中的數(shù)據(jù)。(讀取未提交的數(shù)據(jù))

b、不可重復(fù)讀是指在對(duì)于數(shù)據(jù)庫中的某個(gè)數(shù)據(jù),一個(gè)事務(wù)范圍內(nèi)多次查詢卻返回了不同的數(shù)據(jù)值,這是由于在查詢間隔,被另一個(gè)事務(wù)修改并提交了。(邊讀邊寫)

c、幻讀指兩個(gè)事務(wù)同時(shí)發(fā)生,兩個(gè)事務(wù)修改數(shù)據(jù),讀到的數(shù)據(jù)不是自己開始修改的數(shù)據(jù)?;米x和不可重復(fù)讀都是讀取了另一條已經(jīng)提交的事務(wù)(這點(diǎn)就臟讀不同),所不同的是不可重復(fù)讀查詢的都是同一個(gè)數(shù)據(jù)項(xiàng),而幻讀針對(duì)的是一批數(shù)據(jù)整體。(同時(shí)寫,同時(shí)讀)

3)數(shù)據(jù)庫事務(wù)級(jí)別

默認(rèn)使用Repeatable read級(jí)別,列表級(jí)別從下往上級(jí)別越低。

查看級(jí)別

select @@tx_isolation;

四、寫上面spring事務(wù)和數(shù)據(jù)庫事務(wù)隔離級(jí)別

主要的目的就是了解事務(wù)之間存在的傳遞關(guān)系,這樣在控制的時(shí)候,spring會(huì)通過事務(wù)與事務(wù)之間關(guān)系,來達(dá)到回滾或者提交的效果。

五、如果在沒有辦法使用注解的時(shí)候(比如多線程等)

就要使用手動(dòng)的方式來做事務(wù)管理了,這也就是編程式的事務(wù)管理。

1)首先加入注解

這就是spring的jdbc框架中提供的事務(wù)管理方式

    @Autowired
    private PlatformTransactionManager platformTransactionManager;

    @Autowired
    private TransactionDefinition transactionDefinition;

2)看一下源碼

(DataSourceTransactionManagerAutoConfiguration.class、TransactionTemplate.class)

        @Bean
        @ConditionalOnMissingBean({PlatformTransactionManager.class})
        public DataSourceTransactionManager transactionManager(DataSourceProperties properties) {
            DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(this.dataSource);
            if (this.transactionManagerCustomizers != null) {
                this.transactionManagerCustomizers.customize(transactionManager);
            }

            return transactionManager;
        }

備注:有興趣可以了解一下DataSourceTransactionManager的寫法和原理。

        @Bean
        @ConditionalOnMissingBean
        public TransactionTemplate transactionTemplate() {
            return new TransactionTemplate(this.transactionManager);
        }

注意,這里的所有事務(wù)傳播方式包括處理,都需要自己手動(dòng)去處理。

3)編寫方式

TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
platformTransactionManager.commit(transactionStatus);
platformTransactionManager.rollback(transactionStatus);

說明:這里開發(fā)事務(wù)過后,返回一個(gè)事務(wù)狀態(tài),這個(gè)狀態(tài)記錄了東西,用來控制事務(wù)的管理,當(dāng)然,多個(gè)事務(wù)之間的控制需要人為控制。

4)編程式的事務(wù)控制經(jīng)量少用

因?yàn)榭刂瞥潭壬厦鎭碚fspring的方式還是來的更加不錯(cuò),編程式的方式,更多用于在需要事務(wù)的時(shí)候,沒有辦法加入事務(wù),才采取手動(dòng)控制事務(wù)的方式。

使用示例 :

1 在service內(nèi)注入 這兩個(gè)bean 
@Autowired
private PlatformTransactionManager platformTransactionManager;

@Autowired
private TransactionDefinition transactionDefinition;

2在 service方法內(nèi)創(chuàng)建TransactionStatus
TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
通過 platformTransactionManager.commit(transactionStatus); 提交事務(wù)
通過 platformTransactionManager.rollback(transactionStatus); 回滾事務(wù) 

示例代碼: 

@Autowired
private PlatformTransactionManager platformTransactionManager;

@Autowired
private TransactionDefinition transactionDefinition;

public void b(){
    TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);

    UserIntegralInfo info = new UserIntegralInfo();
    info.setUserId(1L);
    info.setPoint(1);
    info.setOp("");
    info.setCurrIntegral(1);
    integralMapper.insert(info);
    platformTransactionManager.commit(transactionStatus);
    throw new RuntimeException();
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot工程啟動(dòng)時(shí)自動(dòng)執(zhí)行任務(wù)實(shí)現(xiàn)方式

    SpringBoot工程啟動(dòng)時(shí)自動(dòng)執(zhí)行任務(wù)實(shí)現(xiàn)方式

    在SpringBoot中,推薦通過ApplicationRunner/CommandLineRunner或ApplicationReadyEvent監(jiān)聽實(shí)現(xiàn)啟動(dòng)時(shí)自動(dòng)執(zhí)行MQ任務(wù),確保應(yīng)用完全就緒,避免依賴未初始化問題,同時(shí)需配置連接池、重試機(jī)制及多環(huán)境控制,保障系統(tǒng)穩(wěn)定與資源優(yōu)雅關(guān)閉
    2025-09-09
  • eclipse springboot工程打war包方法及再Tomcat中運(yùn)行的方法

    eclipse springboot工程打war包方法及再Tomcat中運(yùn)行的方法

    這篇文章主要介紹了eclipse springboot工程打war包方法及再Tomcat中運(yùn)行的方法,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • SpringBoot整合接口管理工具Swagger

    SpringBoot整合接口管理工具Swagger

    ? Swagger是一系列 RESTful API的工具,通過Swagger可以獲得項(xiàng)目的?種交互式文檔,客戶端SDK的自動(dòng)生成等功能。本文通過代碼示例詳細(xì)介紹了SpringBoot整合接口管理工具Swagger,需要的朋友可以借鑒參考
    2023-04-04
  • 詳解Java編程中線程的掛起、恢復(fù)和終止的方法

    詳解Java編程中線程的掛起、恢復(fù)和終止的方法

    這篇文章主要介紹了詳解Java編程中線程的掛起、恢復(fù)和終止的方法,線程是Java學(xué)習(xí)中的重點(diǎn)和難點(diǎn)知識(shí),需要的朋友可以參考下
    2015-09-09
  • Java那點(diǎn)事——StringBuffer與StringBuilder原理與區(qū)別

    Java那點(diǎn)事——StringBuffer與StringBuilder原理與區(qū)別

    本文給大家分享StringBuffer與StringBuilder的區(qū)別,它們的應(yīng)用場(chǎng)景是什么?非常不錯(cuò),面試考官經(jīng)??嫉囊粋€(gè)問題,有需要的朋友跟著腳本之家小編一起學(xué)習(xí)吧
    2016-06-06
  • Java實(shí)現(xiàn)解數(shù)獨(dú)的小程序

    Java實(shí)現(xiàn)解數(shù)獨(dú)的小程序

    最近在學(xué)習(xí)Java,然后上個(gè)月迷上了九宮格數(shù)獨(dú),玩了幾天,覺得實(shí)在有趣,就想著能不能用編程來解決,于是就自己寫了個(gè),還真解決了。下面這篇文章就給大家主要介紹了Java實(shí)現(xiàn)解數(shù)獨(dú)的小程序,需要的朋友可以參考借鑒。
    2017-01-01
  • SpringBoot讀取yaml文件操作詳解

    SpringBoot讀取yaml文件操作詳解

    YAML 是 “YAML Ain’t Markup Language”(YAML 不是一種標(biāo)記語言)的遞歸縮寫。在開發(fā)的這種語言時(shí),YAML 的意思其實(shí)是:“Yet Another Markup Language”(仍是一種標(biāo)記語言),本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • SpringBoot中使用MongoDB的連接池配置全過程

    SpringBoot中使用MongoDB的連接池配置全過程

    這篇文章主要介紹了SpringBoot中使用MongoDB的連接池配置全過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • Tomcat安裝配置及Eclipse配置詳解

    Tomcat安裝配置及Eclipse配置詳解

    給大家介紹一下Tomcat安裝配置及Eclipse配置的全部圖文過程,如果你對(duì)這個(gè)還有不明白,一起跟著小編學(xué)習(xí)下。
    2017-11-11
  • Java編程Socket實(shí)現(xiàn)多個(gè)客戶端連接同一個(gè)服務(wù)端代碼

    Java編程Socket實(shí)現(xiàn)多個(gè)客戶端連接同一個(gè)服務(wù)端代碼

    這篇文章主要介紹了Java編程Socket實(shí)現(xiàn)多個(gè)客戶端連接同一個(gè)服務(wù)端代碼,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11

最新評(píng)論

溆浦县| 潞西市| 福贡县| 公安县| 阜宁县| 峨边| 余庆县| 饶平县| 榆树市| 稻城县| 隆安县| 铁力市| 扶绥县| 定结县| 龙山县| 若尔盖县| 宝丰县| 阳西县| 迭部县| 元氏县| 平阴县| 佛冈县| 大宁县| 新野县| 清丰县| 新余市| 宁国市| 凤山县| 武山县| 芮城县| 定边县| 布拖县| 青铜峡市| 县级市| 沂南县| 淮北市| 阜新市| 称多县| 丰都县| 铜鼓县| 平和县|