Spring中的事务是如何实现的

简介: Spring中的事务管理机制通过一系列强大的功能和灵活的配置选项,为开发者提供了高效且可靠的事务处理手段。无论是通过注解还是AOP配置,Spring都能轻松实现复杂的事务管理需求。掌握这些工具和最佳实践,能

Spring中的事务是如何实现的

Spring框架提供了一套完整的事务管理机制,旨在简化事务处理,并确保数据操作的原子性、一致性、隔离性和持久性(ACID)。本文将详细介绍Spring事务管理的实现原理、配置方法和常见用法。

1. 事务的基本概念

事务(Transaction)是指一组操作,要么全部成功,要么全部失败。事务的四个关键特性是:

  • 原子性(Atomicity) :事务中的所有操作要么全部完成,要么全部不完成。
  • 一致性(Consistency) :事务执行前后,数据保持一致。
  • 隔离性(Isolation) :多个事务同时进行时,彼此独立。
  • 持久性(Durability) :事务一旦提交,对数据库的改变是永久性的。

2. Spring事务管理的实现原理

2.1. 事务管理器

Spring提供了多个事务管理器,用于处理不同的数据源,如 DataSourceTransactionManagerJpaTransactionManagerHibernateTransactionManager等。事务管理器负责管理事务的生命周期,包括开启、提交和回滚事务。

2.2. 事务传播行为

Spring定义了多种事务传播行为,决定了事务方法在调用其他事务方法时的事务处理方式。常见的传播行为包括:

  • REQUIRED:支持当前事务,如果不存在则创建一个新事务。
  • REQUIRES_NEW:创建一个新事务,如果存在当前事务,则将其挂起。
  • MANDATORY:支持当前事务,如果不存在则抛出异常。
  • SUPPORTS:支持当前事务,如果不存在则以非事务方式执行。
  • NOT_SUPPORTED:以非事务方式执行,如果存在当前事务,则将其挂起。
  • NEVER:以非事务方式执行,如果存在当前事务,则抛出异常。
  • NESTED:支持当前事务,并在其内嵌套一个子事务。

2.3. 事务隔离级别

事务隔离级别决定了一个事务能看见其他事务对数据库所做更改的程度。常见的隔离级别包括:

  • DEFAULT:使用底层数据库的默认隔离级别。
  • READ_UNCOMMITTED:允许读取未提交的数据,可能导致脏读。
  • READ_COMMITTED:只允许读取已提交的数据,防止脏读。
  • REPEATABLE_READ:确保在事务内多次读取数据一致,防止不可重复读。
  • SERIALIZABLE:最高隔离级别,完全锁定读写,防止幻读。

3. Spring事务管理的配置

3.1. 基于XML的配置

在Spring的XML配置文件中启用事务管理:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/tx
           http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- 配置数据源 -->
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
        <!-- 配置数据源属性 -->
    </bean>

    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- 启用注解事务管理 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
​

3.2. 基于Java的配置

在Spring的Java配置类中启用事务管理:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;

@Configuration
@EnableTransactionManagement
public class AppConfig {

    @Bean
    public DataSource dataSource() {
        // 配置并返回数据源
    }

    @Bean
    public DataSourceTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}
​

4. 使用注解管理事务

4.1. @Transactional注解

Spring提供了 @Transactional注解,用于声明事务属性。该注解可以应用于类或方法上。

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    @Transactional
    public void createUser(User user) {
        // 执行数据库操作
    }
}
​

4.2. 自定义事务属性

可以在 @Transactional注解中指定传播行为、隔离级别、超时和回滚规则等属性。

import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    @Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.SERIALIZABLE, timeout = 30, rollbackFor = Exception.class)
    public void createUser(User user) {
        // 执行数据库操作
    }
}
​

4.3. 使用AOP配置事务

除了注解方式,Spring还支持使用AOP(面向切面编程)配置事务管理。

定义切点和事务配置

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="create*" propagation="REQUIRED"/>
        <tx:method name="update*" propagation="REQUIRED"/>
        <tx:method name="delete*" propagation="REQUIRED"/>
        <tx:method name="*" read-only="true"/>
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut id="serviceMethods" expression="execution(* com.example.service.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods"/>
</aop:config>
​

基于Java配置

import org.springframework.aop.framework.ProxyFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.interceptor.TransactionInterceptor;
import org.springframework.transaction.interceptor.TransactionProxyFactoryBean;

import java.util.Properties;

@Configuration
public class AopConfig {

    @Bean
    public TransactionInterceptor transactionInterceptor(PlatformTransactionManager transactionManager) {
        Properties properties = new Properties();
        properties.setProperty("create*", "PROPAGATION_REQUIRED");
        properties.setProperty("update*", "PROPAGATION_REQUIRED");
        properties.setProperty("delete*", "PROPAGATION_REQUIRED");
        properties.setProperty("*", "readOnly");

        TransactionInterceptor interceptor = new TransactionInterceptor();
        interceptor.setTransactionManager(transactionManager);
        interceptor.setTransactionAttributes(properties);
        return interceptor;
    }

    @Bean
    public ProxyFactoryBean userService(TransactionInterceptor transactionInterceptor) {
        ProxyFactoryBean proxyFactoryBean = new ProxyFactoryBean();
        proxyFactoryBean.setTarget(new UserService());
        proxyFactoryBean.addAdvice(transactionInterceptor);
        return proxyFactoryBean;
    }
}
​

5. 事务管理的最佳实践

5.1. 避免事务嵌套

避免在同一事务方法中调用另一个事务方法,以防止事务传播行为不当引发的问题。

5.2. 适当设置超时

为长时间运行的事务设置合理的超时时间,防止锁定资源过长导致性能问题。

5.3. 细化事务范围

将事务范围限定在必要的代码块内,避免不必要的资源占用和性能开销。

5.4. 使用声明式事务

优先使用声明式事务管理(如 @Transactional注解),减少手动管理事务的复杂性和出错风险。

6. 事务管理的常见问题及解决方案

6.1. 事务不回滚

  • 确保捕获的异常是 @Transactional注解的 rollbackFor属性中指定的类型。
  • 检查方法调用是否在同一个类中,如果是,确保方法间调用通过Spring代理进行。

6.2. 事务传播行为不符合预期

  • 检查 @Transactional注解的 propagation属性,确保其设置符合业务逻辑。
  • 使用 Propagation.REQUIRES_NEW时,确保事务管理器支持此传播行为。

6.3. 数据库连接泄漏

  • 确保在事务管理器配置中正确设置数据源。
  • 检查应用程序中是否有未关闭的数据库连接。

结论

Spring中的事务管理机制通过一系列强大的功能和灵活的配置选项,为开发者提供了高效且可靠的事务处理手段。无论是通过注解还是AOP配置,Spring都能轻松实现复杂的事务管理需求。掌握这些工具和最佳实践,能

显著提升应用程序的数据一致性和可靠性。

目录
相关文章
|
6天前
|
存储 人工智能 弹性计算
阿里云弹性计算_加速计算专场精华概览 | 2024云栖大会回顾
2024年9月19-21日,2024云栖大会在杭州云栖小镇举行,阿里云智能集团资深技术专家、异构计算产品技术负责人王超等多位产品、技术专家,共同带来了题为《AI Infra的前沿技术与应用实践》的专场session。本次专场重点介绍了阿里云AI Infra 产品架构与技术能力,及用户如何使用阿里云灵骏产品进行AI大模型开发、训练和应用。围绕当下大模型训练和推理的技术难点,专家们分享了如何在阿里云上实现稳定、高效、经济的大模型训练,并通过多个客户案例展示了云上大模型训练的显著优势。
|
9天前
|
存储 人工智能 调度
阿里云吴结生:高性能计算持续创新,响应数据+AI时代的多元化负载需求
在数字化转型的大潮中,每家公司都在积极探索如何利用数据驱动业务增长,而AI技术的快速发展更是加速了这一进程。
|
23小时前
|
并行计算 前端开发 物联网
全网首发!真·从0到1!万字长文带你入门Qwen2.5-Coder——介绍、体验、本地部署及简单微调
2024年11月12日,阿里云通义大模型团队正式开源通义千问代码模型全系列,包括6款Qwen2.5-Coder模型,每个规模包含Base和Instruct两个版本。其中32B尺寸的旗舰代码模型在多项基准评测中取得开源最佳成绩,成为全球最强开源代码模型,多项关键能力超越GPT-4o。Qwen2.5-Coder具备强大、多样和实用等优点,通过持续训练,结合源代码、文本代码混合数据及合成数据,显著提升了代码生成、推理和修复等核心任务的性能。此外,该模型还支持多种编程语言,并在人类偏好对齐方面表现出色。本文为周周的奇妙编程原创,阿里云社区首发,未经同意不得转载。
|
6天前
|
人工智能 运维 双11
2024阿里云双十一云资源购买指南(纯客观,无广)
2024年双十一,阿里云推出多项重磅优惠,特别针对新迁入云的企业和初创公司提供丰厚补贴。其中,36元一年的轻量应用服务器、1.95元/小时的16核60GB A10卡以及1元购域名等产品尤为值得关注。这些产品不仅价格亲民,还提供了丰富的功能和服务,非常适合个人开发者、学生及中小企业快速上手和部署应用。
|
16天前
|
自然语言处理 数据可视化 前端开发
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
合合信息的智能文档处理“百宝箱”涵盖文档解析、向量化模型、测评工具等,解决了复杂文档解析、大模型问答幻觉、文档解析效果评估、知识库搭建、多语言文档翻译等问题。通过可视化解析工具 TextIn ParseX、向量化模型 acge-embedding 和文档解析测评工具 markdown_tester,百宝箱提升了文档处理的效率和精确度,适用于多种文档格式和语言环境,助力企业实现高效的信息管理和业务支持。
3936 2
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
|
6天前
|
算法 安全 网络安全
阿里云SSL证书双11精选,WoSign SSL国产证书优惠
2024阿里云11.11金秋云创季活动火热进行中,活动月期间(2024年11月01日至11月30日)通过折扣、叠加优惠券等多种方式,阿里云WoSign SSL证书实现优惠价格新低,DV SSL证书220元/年起,助力中小企业轻松实现HTTPS加密,保障数据传输安全。
508 3
阿里云SSL证书双11精选,WoSign SSL国产证书优惠
|
12天前
|
安全 数据建模 网络安全
2024阿里云双11,WoSign SSL证书优惠券使用攻略
2024阿里云“11.11金秋云创季”活动主会场,阿里云用户通过完成个人或企业实名认证,可以领取不同额度的满减优惠券,叠加折扣优惠。用户购买WoSign SSL证书,如何叠加才能更加优惠呢?
987 3
|
10天前
|
机器学习/深度学习 存储 人工智能
白话文讲解大模型| Attention is all you need
本文档旨在详细阐述当前主流的大模型技术架构如Transformer架构。我们将从技术概述、架构介绍到具体模型实现等多个角度进行讲解。通过本文档,我们期望为读者提供一个全面的理解,帮助大家掌握大模型的工作原理,增强与客户沟通的技术基础。本文档适合对大模型感兴趣的人员阅读。
421 18
白话文讲解大模型| Attention is all you need
|
4天前
|
数据采集 人工智能 API
Qwen2.5-Coder深夜开源炸场,Prompt编程的时代来了!
通义千问团队开源「强大」、「多样」、「实用」的 Qwen2.5-Coder 全系列,致力于持续推动 Open Code LLMs 的发展。
|
9天前
|
算法 数据建模 网络安全
阿里云SSL证书2024双11优惠,WoSign DV证书220元/年起
2024阿里云11.11金秋云创季火热进行中,活动月期间(2024年11月01日至11月30日),阿里云SSL证书限时优惠,部分证书产品新老同享75折起;通过优惠折扣、叠加满减优惠券等多种方式,阿里云WoSign SSL证书将实现优惠价格新低,DV SSL证书220元/年起。
562 5