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

Spring Boot的測(cè)試類中使用 @Transactional 注解

 更新時(shí)間:2026年05月28日 14:38:49   作者:yuejuejin  
本文主要介紹了Spring Boot的測(cè)試類中使用 @Transactional 注解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

我的數(shù)據(jù)庫中有一列數(shù)據(jù)需要根據(jù)不同條件update為不同的狀態(tài)值,我直接從ServiceImpl中復(fù)制了一個(gè)方法到Test中,修改完方法體中的幾行代碼后,執(zhí)行Test,控制臺(tái)打印了對(duì)應(yīng)的update語句,但是數(shù)據(jù)庫中該列的狀態(tài)沒有發(fā)生變化。原因就是復(fù)制過去的方法上帶了 @Transactional 注解,我直接加了一個(gè)@Test就開始執(zhí)行,導(dǎo)致事務(wù)回滾了。

現(xiàn)在來補(bǔ)一下相關(guān)知識(shí)。

在 Spring Boot 的測(cè)試類中使用 @Transactional 注解是一個(gè)常見且推薦的做法,但它的行為與你在生產(chǎn)代碼中使用 @Transactional 有所不同,尤其是在執(zhí)行修改 SQL(如 INSERT、UPDATE、DELETE)時(shí)。以下是詳細(xì)解釋:

1. 默認(rèn)行為:事務(wù)回滾

當(dāng)你在 Spring Boot 測(cè)試類(或測(cè)試方法)上使用 @Transactional 注解時(shí),默認(rèn)情況下,整個(gè)測(cè)試方法在一個(gè)事務(wù)中執(zhí)行,并且在測(cè)試方法結(jié)束后,事務(wù)會(huì)自動(dòng)回滾(rollback) ,而不是提交(commit)。

這意味著:

  • 你在測(cè)試中執(zhí)行的修改 SQL(如 UPDATE user SET name = 'test' WHERE id = 1)會(huì)生效于當(dāng)前事務(wù)內(nèi)的數(shù)據(jù)庫操作。
  • 其他數(shù)據(jù)庫操作(如查詢)能看到這些修改。
  • 但一旦測(cè)試方法執(zhí)行完畢,Spring 會(huì)自動(dòng)回滾該事務(wù),所有對(duì)數(shù)據(jù)庫的修改都不會(huì)永久保存到數(shù)據(jù)庫中。

2. 為什么這樣設(shè)計(jì)?

這是為了保證測(cè)試的獨(dú)立性可重復(fù)性

  • 每個(gè)測(cè)試運(yùn)行后,數(shù)據(jù)庫狀態(tài)恢復(fù)到初始狀態(tài),不會(huì)影響其他測(cè)試。
  • 避免測(cè)試之間產(chǎn)生副作用。
  • 無需手動(dòng)清理數(shù)據(jù)庫數(shù)據(jù)。

3. 示例代碼

@SpringBootTest
@Transactional
class UserServiceTest {
    @Autowired
    private UserService userService;
    @Autowired
    private UserRepository userRepository;
    @Test
    void testUpdateUser() {
        // 查詢?cè)紨?shù)據(jù)
        User user = userRepository.findById(1L).orElseThrow();
        String originalName = user.getName();
        // 執(zhí)行修改 SQL(通過 Service 或直接 JPA)
        userService.updateUserName(1L, "NewName");
        // 在當(dāng)前事務(wù)中可以查到修改
        User updatedUser = userRepository.findById(1L).orElseThrow();
        assertEquals("NewName", updatedUser.getName());
        // 測(cè)試結(jié)束,@Transactional 會(huì)導(dǎo)致事務(wù)回滾
        // 數(shù)據(jù)庫中 id=1 的用戶姓名仍為 originalName
    }
}

在這個(gè)例子中,updateUserName 方法執(zhí)行的 SQL 修改在測(cè)試方法內(nèi)部是可見的,但測(cè)試結(jié)束后,數(shù)據(jù)庫不會(huì)真正更新。

4. 如何讓修改真正提交?

如果你希望某個(gè)測(cè)試的修改真正提交到數(shù)據(jù)庫(比如集成測(cè)試或性能測(cè)試),有以下幾種方式:

方法一:移除@Transactional

@SpringBootTest
// 不加 @Transactional,每次修改都會(huì)提交
class IntegrationTest {
    @Test
    void testPersistData() {
        // 修改會(huì)真正寫入數(shù)據(jù)庫
    }
}

方法二:使用@Commit注解

@SpringBootTest
@Transactional
class UserServiceTest {

    @Test
    @Commit // 明確告訴 Spring 提交事務(wù),而不是回滾
    void testUpdateAndCommit() {
        userService.updateUserName(1L, "CommittedName");
        // 測(cè)試結(jié)束后,修改會(huì)真正寫入數(shù)據(jù)庫
    }
}

到此這篇關(guān)于Spring Boot的測(cè)試類中使用 @Transactional 注解的文章就介紹到這了,更多相關(guān)Spring Boot使用@Transactional 注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實(shí)戰(zhàn)小技巧之優(yōu)雅的實(shí)現(xiàn)字符串拼接

    java實(shí)戰(zhàn)小技巧之優(yōu)雅的實(shí)現(xiàn)字符串拼接

    字符串拼接是我們?cè)贘ava代碼中比較經(jīng)常要做的事情,就是把多個(gè)字符串拼接到一起,這篇文章主要給大家介紹了關(guān)于java實(shí)戰(zhàn)小技巧之優(yōu)雅的實(shí)現(xiàn)字符串拼接的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • 淺談java中Math.random()與java.util.random()的區(qū)別

    淺談java中Math.random()與java.util.random()的區(qū)別

    下面小編就為大家?guī)硪黄獪\談java中Math.random()與java.util.random()的區(qū)別。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-09-09
  • Java設(shè)計(jì)模式之策略模式詳細(xì)解析

    Java設(shè)計(jì)模式之策略模式詳細(xì)解析

    這篇文章主要介紹了Java設(shè)計(jì)模式之策略模式詳細(xì)解析,策略模式中,定義算法族,分別封裝起來,讓他們之間可以相互轉(zhuǎn)化,此模式讓算法的變化獨(dú)立于使用算法的客戶,需要的朋友可以參考下
    2023-11-11
  • java實(shí)現(xiàn)voctor按指定方式排序示例分享

    java實(shí)現(xiàn)voctor按指定方式排序示例分享

    這篇文章主要介紹了java實(shí)現(xiàn)voctor按指定方式排序示例,需要的朋友可以參考下
    2014-03-03
  • Java多線程并發(fā)之線程池任務(wù)請(qǐng)求攔截測(cè)試實(shí)例

    Java多線程并發(fā)之線程池任務(wù)請(qǐng)求攔截測(cè)試實(shí)例

    這篇文章主要介紹了Java多線程并發(fā)之線程池任務(wù)請(qǐng)求攔截測(cè)試實(shí)例,隊(duì)列中永遠(yuǎn)沒有線程被加入,即使線程池已滿,也不會(huì)導(dǎo)致被加入排隊(duì)隊(duì)列,實(shí)現(xiàn)了只有線程池存在空閑線程的時(shí)候才會(huì)接受新任務(wù)的需求,需要的朋友可以參考下
    2023-12-12
  • Nacos注冊(cè)中心的部署與用法示例詳解

    Nacos注冊(cè)中心的部署與用法示例詳解

    注冊(cè)中心是微服務(wù)架構(gòu)中的紐帶,類似于“通訊錄”,它記錄了服務(wù)和服務(wù)地址的映射關(guān)系,本文通過示例代碼給大家介紹Nacos注冊(cè)中心的部署與用法,感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • java 中Comparable與Comparator詳解與比較

    java 中Comparable與Comparator詳解與比較

    這篇文章主要介紹了java 中Comparable與Comparator詳解與比較的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • SpringBoot整合Drools的實(shí)現(xiàn)步驟

    SpringBoot整合Drools的實(shí)現(xiàn)步驟

    Drools是一個(gè)易于訪問企業(yè)策略、易于調(diào)整以及易于管理的開源業(yè)務(wù)規(guī)則引擎,符合業(yè)內(nèi)標(biāo)準(zhǔn),速度快、效率高。業(yè)務(wù)分析師或?qū)徍巳藛T可以利用它輕松查看業(yè)務(wù)規(guī)則,從而檢驗(yàn)是否已編碼的規(guī)則執(zhí)行所需的業(yè)務(wù)規(guī)則。本文將講述SpringBoot整合Drools的步驟
    2021-05-05
  • SpringAMQP的使用方式案例詳解

    SpringAMQP的使用方式案例詳解

    這篇文章主要介紹了SpringAMQP的使用方式,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • PowerMockito的基本使用解析

    PowerMockito的基本使用解析

    這篇文章主要介紹了PowerMockito的基本使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評(píng)論

贵州省| 和静县| 长海县| 枝江市| 昌都县| 渝中区| 洞头县| 乳源| 萨嘎县| 尼木县| 承德市| 蚌埠市| 招远市| 博兴县| 霸州市| 罗甸县| 辉南县| 寻甸| 卓资县| 额尔古纳市| 海淀区| 克拉玛依市| 华坪县| 昌吉市| 乳山市| 曲沃县| 新宾| 海宁市| 揭阳市| 鹤山市| 普兰店市| 宁南县| 吐鲁番市| 大城县| 乌拉特后旗| 出国| 昭通市| 阿拉善盟| 青神县| 通州区| 安龙县|