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

java中Spring事務失效的8個常見案例和解決方案

 更新時間:2025年06月07日 10:11:16   投稿:yin  
本文分析了8種Spring事務失效問題及解決方案,涵蓋注解應用、方法調(diào)用、異常處理、數(shù)據(jù)庫支持、傳播行為、類管理與事務管理器配置等,強調(diào)正確配置對數(shù)據(jù)一致性的重要性

Spring事務管理是企業(yè)級Java應用的核心功能,如果使用不當將會引發(fā)嚴重的生產(chǎn)問題,比如因事務失效帶來的數(shù)據(jù)不一致問題。事務失效往往不會拋出異常,而是靜默發(fā)生,等到業(yè)務出現(xiàn)問題時才被發(fā)現(xiàn),造成嚴重的數(shù)據(jù)不一致。本文將分析8種導致Spring事務失效的使用問題并提供相應的解決方案。

一、事務注解應用在非public方法上

問題現(xiàn)象

開發(fā)者在非public方法上添加@Transactional注解,但事務沒有生效。

Spring事務失效的8個經(jīng)典大坑_事務管理

Spring AOP的代理機制默認只攔截public方法。

這是因為事務通知是基于Spring AOP實現(xiàn)的,而Spring AOP默認只攔截public方法調(diào)用。

查看AbstractFallbackTransactionAttributeSource類的源碼可以發(fā)現(xiàn):

// AbstractFallbackTransactionAttributeSource.java
protected TransactionAttribute computeTransactionAttribute(Method method, Class<?> targetClass) {
    // Don't allow no-public methods as required.
    if (allowPublicMethodsOnly() && !Modifier.isPublic(method.getModifiers())) {
        return null;
    }
    // ...
}

非public方法上的@Transactional注解會被直接忽略,返回null,導致事務不生效。

解決方案

確保標注@Transactional的方法為public:

Spring事務失效的8個經(jīng)典大坑_事務管理_02

二、同一個類中方法調(diào)用

問題現(xiàn)象

在同一個類中,非事務方法調(diào)用事務方法,或者事務方法調(diào)用另一個具有不同事務屬性的方法,事務會失效。

Spring事務失效的8個經(jīng)典大坑_事務管理_03

原理分析

Spring事務失效的8個經(jīng)典大坑_事務管理_04

解決方案

有幾種方法可以解決:

方法1:使用自我注入

Spring事務失效的8個經(jīng)典大坑_事務管理_05

方法2:使用AopContext獲取代理對象(需要額外配置)

Spring事務失效的8個經(jīng)典大坑_事務管理_06

方法3:將方法拆分到不同的類中

Spring事務失效的8個經(jīng)典大坑_解決方案_07

三、異常被吞沒

問題現(xiàn)象

開發(fā)者在事務方法中捕獲了異常但沒有重新拋出,導致事務無法回滾。

Spring事務失效的8個經(jīng)典大坑_回滾_08

原理分析

Spring事務失效的8個經(jīng)典大坑_事務管理_09

解決方案

有兩種解決方法:

方法1:重新拋出異常

Spring事務失效的8個經(jīng)典大坑_事務管理_10

方法2:使用TransactionAspectSupport手動回滾

Spring事務失效的8個經(jīng)典大坑_回滾_11

四、異常類型不匹配回滾規(guī)則

問題現(xiàn)象

開發(fā)者拋出了異常,但事務沒有回滾。

這通常是因為拋出的異常類型不滿足默認的回滾規(guī)則。

Spring事務失效的8個經(jīng)典大坑_回滾_12

原理分析

Spring默認只在遇到未檢查異常(RuntimeException及其子類)和Error時才回滾事務。

受檢異常(如IOException、SQLException)被認為是業(yè)務異常,默認情況下不會觸發(fā)事務回滾。

這是因為@Transactional注解的默認配置是:

@Transactional(rollbackFor = RuntimeException.class)

解決方案

有兩種解決方法:

方法1:指定回滾的異常類型

Spring事務失效的8個經(jīng)典大坑_解決方案_13

方法2:將受檢異常轉換為非受檢異常

Spring事務失效的8個經(jīng)典大坑_回滾_14

五、數(shù)據(jù)庫不支持事務

問題現(xiàn)象

所有事務配置看起來都正確,但事務仍然不生效。

原理分析

Spring事務失效的8個經(jīng)典大坑_回滾_15

解決方案

確保使用支持事務的數(shù)據(jù)庫引擎:

  1. 1. 對于MySQL,使用InnoDB引擎而不是MyISAM
  2. 2. 檢查表的創(chuàng)建語句,確保引擎類型正確:
-- 檢查表引擎
SHOW TABLE STATUS WHERE Name = 'your_table_name';

-- 修改表引擎為InnoDB
ALTER TABLE your_table_name ENGINE=InnoDB;

六、錯誤的傳播行為設置

問題現(xiàn)象

在嵌套事務場景中,內(nèi)部事務的回滾沒有按照預期工作。

Spring事務失效的8個經(jīng)典大坑_回滾_16

原理分析

Spring提供了不同的事務傳播行為,用于控制事務的邊界。

最常用的是:

Spring事務失效的8個經(jīng)典大坑_事務管理_17

使用不當?shù)膫鞑バ袨闀е率聞辗秶环项A期,特別是在異常處理場景中。

解決方案

根據(jù)業(yè)務需求選擇正確的傳播行為:

Spring事務失效的8個經(jīng)典大坑_事務管理_18

傳播行為選擇指南

Spring事務失效的8個經(jīng)典大坑_回滾_19

七、未被Spring管理的類

問題現(xiàn)象

在類上添加了@Transactional注解,但事務沒有生效。

Spring事務失效的8個經(jīng)典大坑_回滾_20

原理分析

Spring事務失效的8個經(jīng)典大坑_事務管理_21

解決方案

確保類被Spring容器管理:

@Service // 正確:添加@Service注解
public class UserService {
    
    @Autowired
    private UserMapper userMapper;
    
    @Transactional
    public void createUser(User user) {
        userMapper.insert(user);
        throw new RuntimeException("測試");
        // 現(xiàn)在事務會正?;貪L
    }
}

同時,確保組件掃描配置正確:

@Configuration
@ComponentScan("com.example.service") // 確保包路徑正確
public class AppConfig {
    // ...
}

八、事務管理器配置錯誤

問題現(xiàn)象

使用了正確的事務注解,但事務不生效或者出現(xiàn)異常。

原理分析

Spring支持多種事務管理器,針對不同的持久化技術:

Spring事務失效的8個經(jīng)典大坑_回滾_22

如果配置了錯誤的事務管理器,或者在多數(shù)據(jù)源環(huán)境中未指定正確的事務管理器,會導致事務失效。

解決方案

單數(shù)據(jù)源環(huán)境:確保配置正確的事務管理器

Spring事務失效的8個經(jīng)典大坑_回滾_23

多數(shù)據(jù)源環(huán)境:指定使用的事務管理器

@Configuration
@EnableTransactionManagement
public class MultiDatabaseConfig {
    
    @Bean
    public DataSource primaryDataSource() {
        // 主數(shù)據(jù)源配置...
        return new HikariDataSource();
    }
    
    @Bean
    public DataSource secondaryDataSource() {
        // 次數(shù)據(jù)源配置...
        return new HikariDataSource();
    }
    
    @Bean
    public PlatformTransactionManager primaryTransactionManager() {
        return new DataSourceTransactionManager(primaryDataSource());
    }
    
    @Bean
    public PlatformTransactionManager secondaryTransactionManager() {
        return new DataSourceTransactionManager(secondaryDataSource());
    }
}

@Service
public class UserService {
    
    // 指定使用的事務管理器
    @Transactional(transactionManager = "primaryTransactionManager")
    public void createUser(User user) {
        // 使用主數(shù)據(jù)源的操作
    }
    
    @Transactional(transactionManager = "secondaryTransactionManager")
    public void createUserLog(UserLog log) {
        // 使用次數(shù)據(jù)源的操作
    }
}

總結

到此這篇關于java中Spring事務失效的8個常見案例和解決方案的文章就介紹到這了,更多相關Spring事務失效的8個常見案例內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • springboot 使用yml配置文件自定義屬性的操作代碼

    springboot 使用yml配置文件自定義屬性的操作代碼

    在SpringBoot中yml/yaml文件可以自定義一些屬性,以供注入給自定義bean對象的屬性,主要通過空格和層次來實現(xiàn),類似于python代碼,本文通過實例代碼給大家介紹springboot 使用yml配置文件自定義屬性,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • Java中Timer的schedule()方法參數(shù)詳解

    Java中Timer的schedule()方法參數(shù)詳解

    今天小編就為大家分享一篇關于Java中Timer的schedule()方法參數(shù)詳解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Struts2+uploadify多文件上傳實例

    Struts2+uploadify多文件上傳實例

    這篇文章主要為大家詳細介紹了Struts2+uploadify多文件上傳實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Jackson 反序列化時實現(xiàn)大小寫不敏感設置

    Jackson 反序列化時實現(xiàn)大小寫不敏感設置

    這篇文章主要介紹了Jackson 反序列化時實現(xiàn)大小寫不敏感設置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • CAT分布式實時監(jiān)控系統(tǒng)使用詳解

    CAT分布式實時監(jiān)控系統(tǒng)使用詳解

    這篇文章主要為大家介紹了CAT分布式實時監(jiān)控系統(tǒng)介紹詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Java類加載器ClassLoader詳解

    Java類加載器ClassLoader詳解

    這篇文章主要介紹了Java類加載器ClassLoader,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • Java中Boolean與字符串或者數(shù)字1和0的轉換實例

    Java中Boolean與字符串或者數(shù)字1和0的轉換實例

    下面小編就為大家?guī)硪黄狫ava中Boolean與字符串或者數(shù)字1和0的轉換實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • java讀取word-excel-ppt文件代碼

    java讀取word-excel-ppt文件代碼

    OFFICE文檔使用POI控件,PDF可以使用PDFBOX0.7.3控件,完全支持中文,用XPDF也行,不過感覺PDFBOX比較好,而且作者也在更新。水平有限,萬望各位指正
    2009-04-04
  • Java私有構造函數(shù)作用原理解析

    Java私有構造函數(shù)作用原理解析

    這篇文章主要介紹了Java私有構造函數(shù)作用原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • mybatis-plus分頁查詢的實現(xiàn)實例

    mybatis-plus分頁查詢的實現(xiàn)實例

    頁查詢是一項常用的數(shù)據(jù)庫查詢方法,本文主要介紹了mybatis-plus分頁查詢的實現(xiàn)實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-06-06

最新評論

厦门市| 闽清县| 绥化市| 凌云县| 新建县| 景宁| 个旧市| 巴南区| 大埔县| 界首市| 崇文区| 全椒县| 普定县| 兴城市| 昌宁县| 德庆县| 望城县| 玉环县| 安新县| 乌兰浩特市| 日照市| 江都市| 宁德市| 乐安县| 汕头市| 惠水县| 东平县| 乌什县| 高碑店市| 广昌县| 新河县| 梁平县| 广州市| 呼图壁县| 手游| 大石桥市| 武冈市| 南通市| 石阡县| 丹凤县| 榆树市|