亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java中Spring事務(wù)失效的8個(gè)常見(jiàn)案例和解決方案

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

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

一、事務(wù)注解應(yīng)用在非public方法上

問(wèn)題現(xiàn)象

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

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

Spring AOP的代理機(jī)制默認(rèn)只攔截public方法。

這是因?yàn)槭聞?wù)通知是基于Spring AOP實(shí)現(xiàn)的,而Spring AOP默認(rèn)只攔截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注解會(huì)被直接忽略,返回null,導(dǎo)致事務(wù)不生效。

解決方案

確保標(biāo)注@Transactional的方法為public:

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

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

問(wèn)題現(xiàn)象

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

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

原理分析

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

解決方案

有幾種方法可以解決:

方法1:使用自我注入

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

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

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

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

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

三、異常被吞沒(méi)

問(wèn)題現(xiàn)象

開(kāi)發(fā)者在事務(wù)方法中捕獲了異常但沒(méi)有重新拋出,導(dǎo)致事務(wù)無(wú)法回滾。

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

原理分析

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

解決方案

有兩種解決方法:

方法1:重新拋出異常

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

方法2:使用TransactionAspectSupport手動(dòng)回滾

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

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

問(wèn)題現(xiàn)象

開(kāi)發(fā)者拋出了異常,但事務(wù)沒(méi)有回滾。

這通常是因?yàn)閽伋龅漠惓n愋筒粷M足默認(rèn)的回滾規(guī)則。

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

原理分析

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

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

這是因?yàn)?code>@Transactional注解的默認(rèn)配置是:

@Transactional(rollbackFor = RuntimeException.class)

解決方案

有兩種解決方法:

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

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

方法2:將受檢異常轉(zhuǎn)換為非受檢異常

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

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

問(wèn)題現(xiàn)象

所有事務(wù)配置看起來(lái)都正確,但事務(wù)仍然不生效。

原理分析

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

解決方案

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

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

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

六、錯(cuò)誤的傳播行為設(shè)置

問(wèn)題現(xiàn)象

在嵌套事務(wù)場(chǎng)景中,內(nèi)部事務(wù)的回滾沒(méi)有按照預(yù)期工作。

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

原理分析

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

最常用的是:

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

使用不當(dāng)?shù)膫鞑バ袨闀?huì)導(dǎo)致事務(wù)范圍不符合預(yù)期,特別是在異常處理場(chǎng)景中。

解決方案

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

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

傳播行為選擇指南

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

七、未被Spring管理的類

問(wèn)題現(xiàn)象

在類上添加了@Transactional注解,但事務(wù)沒(méi)有生效。

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

原理分析

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

解決方案

確保類被Spring容器管理:

@Service // 正確:添加@Service注解
public class UserService {
    
    @Autowired
    private UserMapper userMapper;
    
    @Transactional
    public void createUser(User user) {
        userMapper.insert(user);
        throw new RuntimeException("測(cè)試");
        // 現(xiàn)在事務(wù)會(huì)正常回滾
    }
}

同時(shí),確保組件掃描配置正確:

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

八、事務(wù)管理器配置錯(cuò)誤

問(wèn)題現(xiàn)象

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

原理分析

Spring支持多種事務(wù)管理器,針對(duì)不同的持久化技術(shù):

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

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

解決方案

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

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

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

@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 {
    
    // 指定使用的事務(wù)管理器
    @Transactional(transactionManager = "primaryTransactionManager")
    public void createUser(User user) {
        // 使用主數(shù)據(jù)源的操作
    }
    
    @Transactional(transactionManager = "secondaryTransactionManager")
    public void createUserLog(UserLog log) {
        // 使用次數(shù)據(jù)源的操作
    }
}

總結(jié)

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

相關(guān)文章

  • SpringBoot使用SensitiveWord實(shí)現(xiàn)敏感詞過(guò)濾

    SpringBoot使用SensitiveWord實(shí)現(xiàn)敏感詞過(guò)濾

    這篇文章主要為大家詳細(xì)介紹了SpringBoot如何使用SensitiveWord實(shí)現(xiàn)敏感詞過(guò)濾功能,文中示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-01-01
  • Linux環(huán)境卸載Centos7自帶的OpenJDK和安裝JDK1.8圖文教程

    Linux環(huán)境卸載Centos7自帶的OpenJDK和安裝JDK1.8圖文教程

    CentOS系統(tǒng)是開(kāi)發(fā)者常用的Linux操作系統(tǒng),安裝它時(shí)會(huì)默認(rèn)安裝自帶的舊版本的OpenJDK,但在開(kāi)發(fā)者平時(shí)開(kāi)發(fā)Java項(xiàng)目時(shí)還是需要完整的JDK,這篇文章主要給大家介紹了關(guān)于Linux環(huán)境卸載Centos7自帶的OpenJDK和安裝JDK1.8的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • Java枚舉類型與泛型使用解讀

    Java枚舉類型與泛型使用解讀

    這篇文章主要介紹了Java枚舉類型與泛型使用解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • spring?mvc?AOP切面方法未執(zhí)行的一種情況的分析和處理過(guò)程

    spring?mvc?AOP切面方法未執(zhí)行的一種情況的分析和處理過(guò)程

    這篇文章主要介紹了spring?mvc?AOP切面方法未執(zhí)行的一種情況的分析和處理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • java設(shè)計(jì)模式:原始模型模式

    java設(shè)計(jì)模式:原始模型模式

    這篇文章主要為大家詳細(xì)介紹了Java設(shè)計(jì)模式之Prototype原型模式的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • java實(shí)現(xiàn)哈弗曼編碼與反編碼實(shí)例分享(哈弗曼算法)

    java實(shí)現(xiàn)哈弗曼編碼與反編碼實(shí)例分享(哈弗曼算法)

    本文介紹java實(shí)現(xiàn)哈弗曼編碼與反編碼實(shí)例,大家參考使用吧
    2014-01-01
  • 解決Feign異步調(diào)用丟失上下文問(wèn)題

    解決Feign異步調(diào)用丟失上下文問(wèn)題

    在微服務(wù)中使用Feign調(diào)用時(shí),若需要攜帶登錄狀態(tài)的Cookie信息,通常會(huì)使用攔截器,但在異步調(diào)用(如order服務(wù)異步調(diào)用會(huì)員服務(wù)和購(gòu)物車服務(wù))時(shí),攔截器可能無(wú)法獲取上下文信息,導(dǎo)致異常,解決方法是將RequestContextHolder的數(shù)據(jù)同步到新開(kāi)啟的線程中
    2024-11-11
  • Spring Boot整合Swagger測(cè)試api構(gòu)建全紀(jì)錄

    Spring Boot整合Swagger測(cè)試api構(gòu)建全紀(jì)錄

    這篇文章主要給大家介紹了關(guān)于Spring Boot整合Swagger測(cè)試api構(gòu)建的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • Java淺析枚舉類的使用

    Java淺析枚舉類的使用

    枚舉類型可以取代以往常量的定義方式,即將常量封裝在類或接口中。此外,枚舉類型還提供了安全檢查功能。本文就來(lái)和大家講講Java中枚舉類的用法,需要的可以參考一下
    2022-07-07
  • SWT(JFace)體驗(yàn)之ApplicationWindow

    SWT(JFace)體驗(yàn)之ApplicationWindow

    SWT(JFace)體驗(yàn)之ApplicationWindow
    2009-06-06

最新評(píng)論