欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2024年01月15日 10:13:16   作者:Mu_Mu是一只小白  
這篇文章主要介紹了SpringBoot中的事務(wù)配置管理詳解,Spring Boot 默認(rèn)的事務(wù)規(guī)則是遇到運行異常(RuntimeException)和程序錯誤(Error)才會回滾,但是拋出SQLException就無法回滾了,需要的朋友可以參考下

Spring Boot事務(wù)配置管理

場景:我們在開發(fā)企業(yè)應(yīng)用時,由于數(shù)據(jù)操作在順序執(zhí)行的過程中,線上可能有各種無法預(yù)知的問題,

任何一步操作都有可能發(fā)生異常,異常則會導(dǎo)致后續(xù)的操作無法完成。此時由于業(yè)務(wù)邏輯并未正確的完

成,所以在之前操作過數(shù)據(jù)庫的動作并不可靠,需要在這種情況下進(jìn)行數(shù)據(jù)的回滾。

1. 導(dǎo)入依賴

springboot的事務(wù)管理需要導(dǎo)入spring-boot-starter-jdbc;而我們導(dǎo)入的mybatis-spring-boot-starter包含了它,所以無需重復(fù)導(dǎo)入;

 <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.1</version>
        </dependency>

2. 事務(wù)測試

1)mapper接口

@Insert("insert into tb_filminfo (typeid,filmname,ticketprice) values(#{typeid},#{filmname},#{ticketprice})")
    int insert(FilminfoPO po);

2)service接口

public interface IFilmInfoService {
    //插入一條記錄
    public int insert(FilminfoPO po);

3)service實現(xiàn)類

@Service
public class FilmInfoServiceImpl implements IFilmInfoService {
   @Resource
    private FilmInfoMapper mapper;

    @Transactional
    @Override
    public int insert(FilminfoPO po) {

        return mapper.insert(po);
    }

4)controller類

@Controller
@RequestMapping("/film")
public class FilmInfoController {

   @Resource
    IFilmInfoService service;

    @RequestMapping("/insert")
    public String insert(FilminfoPO po) {
       if (po!=null) {
            int i = service.insert(po);
            return "success";
        } else {
            return "false";
        }
    }
}

當(dāng)沒有異常拋出時添加成功,有異常出現(xiàn)添加失敗;

3. 事務(wù)處理的一些特殊情況

1)異常并沒有被捕獲到

異常并沒有被 ”捕獲“ 到,導(dǎo)致事務(wù)并沒有回滾。

Spring Boot 默認(rèn)的事務(wù)規(guī)則是遇到運行異常(RuntimeException)和程序 錯誤(Error)才會回滾。但是拋出 SQLException 就無法回滾了。

   @Transactional
    @Override
    public void insert(FilminfoPO po) throws SQLException {
        // 手動拋出異常
        mapper.insert(po);
        throw new SQLException("數(shù)據(jù)庫異常");

雖然拋出異常但是數(shù)據(jù)插入成功;

解決方案:針對非運行時異常,如果要進(jìn)行事務(wù)回滾的話,可以在 @Transactional 注解中使用 rollbackFor 屬性來指定異常,比如 @Transactional(rollbackFor = Exception.class) ,這樣就沒有問題了,所以在實際項目中,一定要指定異常。

 @Transactional(rollbackFor = Exception.class)
    @Override
    public void insert(FilminfoPO po) throws SQLException {
        // 手動拋出異常
        mapper.insert(po);
        throw new SQLException("數(shù)據(jù)庫異常");
    }

這樣就插入失敗了;

2)異常在方法中被捕獲導(dǎo)致事務(wù)回滾失敗

我們在處理異常時,有兩種方式, 要么拋出去,讓上一層來捕獲處理;要么把異常 try catch 掉,在異常出現(xiàn)的地方給處理掉。就因為有 這中 try…catch,所以導(dǎo)致異常被 ”吃“ 掉,事務(wù)無法回滾。

    @Transactional
    @Override
    public int insert(FilminfoPO po) {
        try {
            int i = 1 / 0;
        } catch (Exception e) {
            e.getMessage();
        }
        return mapper.insert(po);
    }

記錄成功被插入;

解決方法:直接往上拋,給上一層來處理即可

3)事務(wù)的范圍 沖突導(dǎo)致回滾失敗

許多業(yè)務(wù)需要在高并發(fā)的情況下保證數(shù)據(jù)唯一性所比要加synchronized關(guān)鍵字如一個數(shù)據(jù)庫中,針對某個用戶,只有一條記錄,下一個插入動作過來,會先判斷該數(shù)據(jù)庫 中有沒有相同的用戶,如果有就不插入,就更新,沒有才插入,所以理論上,數(shù)據(jù)庫中永遠(yuǎn)就一條同一 用戶信息,不會出現(xiàn)同一數(shù)據(jù)庫中插入了兩條相同用戶的信息。

    @Transactional(rollbackFor = Exception.class)
    @Override
    public synchronized void insert(FilminfoPO po) throws SQLException {
        // 手動拋出異常
        mapper.insert(po);
     
    }

但是在壓測時,數(shù)據(jù)庫中確實可能有兩條同一用戶的信息,分析其原因,在于事務(wù)的

范圍和鎖的范圍問題。

在執(zhí)行該方法開始時,事務(wù)啟動,執(zhí)行 完了后,事務(wù)關(guān)閉。但是 synchronized 沒有起作用,其實根本原因是因為事務(wù)的范圍比鎖的范圍大。 也就是說,在加鎖的那部分代碼執(zhí)行完之后,鎖釋放掉了,但是事務(wù)還沒結(jié)束,此時另一個線程進(jìn)來 了,事務(wù)沒結(jié)束的話,第二個線程進(jìn)來時,數(shù)據(jù)庫的狀態(tài)和第一個線程剛進(jìn)來是一樣的。即由于mysql Innodb引擎的默認(rèn)隔離級別是可重復(fù)讀(在同一個事務(wù)里,SELECT的結(jié)果是事務(wù)開始時時間點的狀 態(tài)),線程二事務(wù)開始的時候,線程一還沒提交完成,導(dǎo)致讀取的數(shù)據(jù)還沒更新。第二個線程也做了插 入動作,導(dǎo)致了臟數(shù)據(jù)。

解決方案:

? 1.把事務(wù)去掉即可(不推薦);

? 2. 在調(diào)用該 service 的地方加鎖,保證鎖 的范圍比事務(wù)的范圍大即可。

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

相關(guān)文章

  • SpringBoot整合Mybatis-plus實現(xiàn)多級評論功能

    SpringBoot整合Mybatis-plus實現(xiàn)多級評論功能

    本文介紹了如何使用SpringBoot整合Mybatis-plus實現(xiàn)多級評論功能,同時提供了數(shù)據(jù)庫的設(shè)計和詳細(xì)的后端代碼,前端界面使用的Vue2,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-05-05
  • Java基礎(chǔ)之JDBC的數(shù)據(jù)庫連接與基本操作

    Java基礎(chǔ)之JDBC的數(shù)據(jù)庫連接與基本操作

    這篇文章主要介紹了Java基礎(chǔ)之JDBC的數(shù)據(jù)庫連接與基本操作,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們也有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • java隊列之queue用法實例分析

    java隊列之queue用法實例分析

    這篇文章主要介紹了java隊列之queue用法實例分析,Queue 隊列就是一個先入先出(FIFO)的數(shù)據(jù)結(jié)構(gòu),Queue接口繼承Collection接口。感興趣的可以了解一下
    2020-07-07
  • Java String類字符串的理解與認(rèn)知

    Java String類字符串的理解與認(rèn)知

    String字符串和char字符不同,char使用單引號,只能表示一個字符,字符串就是一段文本。String是個類。這個類使用final修飾,所以這個類是不可以繼承擴充和修改它的方法的
    2021-10-10
  • Java兩種方式實現(xiàn)動態(tài)代理

    Java兩種方式實現(xiàn)動態(tài)代理

    Java 在 java.lang.reflect 包中有自己的代理支持,該類(Proxy.java)用于動態(tài)生成代理類,只需傳入目標(biāo)接口、目標(biāo)接口的類加載器以及 InvocationHandler 便可為目標(biāo)接口生成代理類及代理對象。我們稱這個Java技術(shù)為:動態(tài)代理
    2020-10-10
  • 基于spring同名bean覆蓋問題的解決

    基于spring同名bean覆蓋問題的解決

    這篇文章主要介紹了spring同名bean覆蓋問題的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • IDEA 熱部署設(shè)置(JRebel插件激活)

    IDEA 熱部署設(shè)置(JRebel插件激活)

    這篇文章主要介紹了IDEA 熱部署設(shè)置(JRebel插件激活),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 詳解如何用Java去除HTML標(biāo)簽

    詳解如何用Java去除HTML標(biāo)簽

    在平時工作中,偶爾會用 Java 做一些解析HTML的工作。有時需要刪除所有的HTML標(biāo)簽,只保留純文字內(nèi)容。這個問題在做過一些爬蟲工作的朋友來說很簡單。下面來說說,我們平時使用到的集中解析的方法
    2022-12-12
  • 詳解Spring3.x 升級至 Spring4.x的方法

    詳解Spring3.x 升級至 Spring4.x的方法

    本篇文章主要介紹了詳解Spring3.x 升級至 Spring4.x的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • Spring?Data?JPA命名約定查詢實現(xiàn)方法

    Spring?Data?JPA命名約定查詢實現(xiàn)方法

    這篇文章主要為大家介紹了Spring?Data?JPA命名約定查詢實現(xiàn)方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12

最新評論