在Spring框架中,XML配置事务

简介: 在Spring框架中,XML配置事务

在Spring框架中,XML配置提供了多种方式来实现事务管理,今天用TransactionProxyFactoryBean实现配置

TransactionProxyFactoryBean

使用TransactionProxyFactoryBean来创建一个代理bean,该代理bean会为目标bean(在这里是testTransactionService)的方法调用添加事务管理。

事务管理器定义

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

这里定义了一个事务管理器transactionManager,它是DataSourceTransactionManager的一个实例。这个事务管理器将用于处理与数据库相关的事务。dataSource属性引用了数据源,该数据源在配置中应该已经定义好了。

基础事务代理配置

<!-- 定义需要进行事务管理的方法 --> 
<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">  
    <property name="transactionManager" ref="transactionManager" />  
</bean>

这里定义了一个基础的事务代理beanbaseTransactionProxy。这个bean是抽象的(abstract="true"),意味着它本身不会被实例化,而是作为其他bean的父bean来使用的。它配置了一个transactionManager属性,引用了前面定义的事务管理器。

具体事务代理配置

<bean id="testServiceTra" parent="baseTransactionProxy">  
    <property name="target" ref="testTransactionService" />  
    <property name="transactionAttributes">  
        <props>  
<!-- 指定某个方法进行事务管理 这里是所有-->
            <prop key="*">  
                PROPAGATION_REQUIRED,-RRException  
            </prop>  
        </props>  
    </property>  
</bean>

这里定义了一个具体的事务代理bean

testServiceTra,它的父bean是baseTransactionProxy。这个bean的目标bean(即被代理的bean)是testTransactionService

transactionAttributes属性定义了事务的属性。在这个例子中,<prop key="*">表示这个配置适用于目标bean的所有方法(*是一个通配符)。PROPAGATION_REQUIRED表示这些方法需要在事务中运行,如果当前没有事务,就会创建一个新的事务。

-RRException表示如果方法执行过程中抛出了RRException异常,那么该异常不会被视为回滚事务的原因。也就是说,即使testTransactionService的方法在执行过程中抛出了RRException异常,事务仍然会提交,而不是回滚。

如果想配置其中一个方法或者配置某些名字开头、结尾的方法名

对于特定方法,您可以使用方法的全名作为键。例如,如果testTransactionService有一个名为testTransactionOne的方法,并且您想为它配置特定的事务属性,您可以这样写:

<property name="transactionAttributes">  
    <props>  
<!-- 指定某个方法进行事务管理 -->
        <prop key="testTransactionOne">PROPAGATION_REQUIRED</prop>  
    </props>  
</property>

如果您想为所有以test开头的方法配置相同的事务属性

您可以使用通配符*来匹配以approve开头的任意方法名:

<property name="transactionAttributes">  
    <props>  
<!-- 指定某个方法进行事务管理 test开头-->
        <prop key="test*">PROPAGATION_REQUIRED</prop>  
    </props>  
</property>

如果您想为所有以Service结尾的方法配置相同的事务属性

<property name="transactionAttributes">  
    <props>  
<!-- 指定某个方法进行事务管理 Service结尾区分大小写-->
        <prop key="*Service">PROPAGATION_REQUIRED</prop>  
    </props>  
</property>

请注意,这些键(key)是区分大小写的

如果您想为多个特定方法配置不同的事务属性,您可以添加更多的<prop>元素,每个元素对应一个方法名或模式:

<property name="transactionAttributes">  
    <props>  
        <prop key="testTransactionOne">PROPAGATION_REQUIRED</prop>  
        <prop key="testTransactionTwo">PROPAGATION_REQUIRES_NEW</prop>  
        <prop key="testTransactionThree*">PROPAGATION_MANDATORY</prop>  
    </props>  
</property>

在Spring框架中,事务传播行为定义了当一个事务方法被另一个事务方法调用时,应该如何使用事务。

Spring定义了七种不同的事务传播行为:

  1. PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务。这是最常用的设置。
  2. PROPAGATION_REQUIRES_NEW:当前方法必须开启一个新的事务。如果当前存在事务,则挂起该事务。这个传播行为通常用于需要独立事务的情况,例如在一个事务中调用另一个方法,但需要保证被调用方法的事务与当前事务独立。
  3. PROPAGATION_MANDATORY:表示当前方法必须在事务中运行。如果当前没有事务,将抛出异常。
  4. PROPAGATION_NESTED:如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或者回滚。如果当前没有事务,那么其行为与PROPAGATION_REQUIRED一样。
  5. PROPAGATION_NEVER:表示当前方法不应该运行在事务上下文中。如果当前正有一个事务在运行,则抛出异常。
  6. PROPAGATION_NOT_SUPPORTED:表示该方法不应该运行在事务中。如果当前存在事务,那么该方法的调用将不会运行在事务中。
  7. PROPAGATION_SUPPORTS:表示当前方法不需要事务上下文,但是如果存在当前事务的话,那么该方法会在这个事务中运行。

在Spring中,通过TransactionProxyFactoryBean@Transactional注解配置的事务属性,通常适用于代理对象所公开(public)的方法。Spring的AOP(面向切面编程)机制,包括事务管理,主要关注公开的方法调用,因为它们是跨切面的关注点。

对于private方法,由于它们不是公开的,因此通常不会被Spring AOP所拦截。Spring的代理是基于Java的接口或类的继承,它只能拦截到通过代理对象调用的公开方法。因此,如果您尝试在private方法上应用事务属性,这些属性将不会被考虑,因为private方法调用通常发生在代理创建之前,即目标对象内部。

因此,当您配置事务属性时,应该只关注public方法。如果您需要为private方法配置事务,您可能需要重新考虑您的设计,将逻辑移动到public方法中,或者考虑使用其他机制(如编程式事务管理)来处理这种情况。

这里是一个例子,展示了如何只为public方法配置事务属性:

<property name="transactionAttributes">  
    <props>  
        <prop key="publicMethod*">PROPAGATION_REQUIRED</prop>  
    </props>  
</property>

publicMethod*模式将匹配所有以publicMethod开头的public方法,并应用PROPAGATION_REQUIRED事务属性。

如果您使用注解来配置事务,情况也是相同的。只有标记了@Transactionalpublic方法才会被Spring拦截并应用事务管理。


相关文章
|
4月前
|
安全 Java Ruby
我尝试了所有后端框架 — — 这就是为什么只有 Spring Boot 幸存下来
作者回顾后端开发历程,指出多数框架在生产环境中难堪重负。相比之下,Spring Boot凭借内置安全、稳定扩展、完善生态和企业级支持,成为构建高可用系统的首选,真正经受住了时间与规模的考验。
369 2
|
4月前
|
Java 关系型数据库 MySQL
Spring Boot自动配置:魔法背后的秘密
Spring Boot 自动配置揭秘:只需简单配置即可启动项目,背后依赖“约定大于配置”与条件化装配。核心在于 `@EnableAutoConfiguration` 注解与 `@Conditional` 系列条件判断,通过 `spring.factories` 或 `AutoConfiguration.imports` 加载配置类,实现按需自动装配 Bean。
|
4月前
|
SQL Java 关系型数据库
Spring事务传播机制:7种姿势教你玩转"事务接力赛"
事务传播机制是Spring框架中用于管理事务行为的重要概念,它决定了在方法调用时事务如何传递与执行。通过7种传播行为,开发者可以灵活控制事务边界,适应不同业务场景。例如:REQUIRED默认加入或新建事务,REQUIRES_NEW独立开启新事务,NESTED支持嵌套回滚等。合理使用传播机制不仅能保障数据一致性,还能提升系统性能与健壮性。掌握这“七种人格”,才能在复杂业务中游刃有余。
|
4月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
1734 0
|
3月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
3月前
|
前端开发 Java 应用服务中间件
《深入理解Spring》 Spring Boot——约定优于配置的革命者
Spring Boot基于“约定优于配置”理念,通过自动配置、起步依赖、嵌入式容器和Actuator四大特性,简化Spring应用的开发与部署,提升效率,降低门槛,成为现代Java开发的事实标准。
|
3月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
178 8
|
4月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
735 5
|
4月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
241 0
探索Spring Boot的@Conditional注解的上下文配置
|
8月前
|
Android开发 开发者
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
本文详细介绍了如何通过自定义 `attrs.xml` 文件实现 Android 自定义 View 的属性配置。以一个包含 TextView 和 ImageView 的 DemoView 为例,讲解了如何使用自定义属性动态改变文字内容和控制图片显示隐藏。同时,通过设置布尔值和点击事件,实现了图片状态的切换功能。代码中展示了如何在构造函数中解析自定义属性,并通过方法 `setSetting0n` 和 `setbackeguang` 实现功能逻辑的优化与封装。此示例帮助开发者更好地理解自定义 View 的开发流程与 attrs.xml 的实际应用。
243 2
Android自定义View之不得不知道的文件attrs.xml(自定义属性)

热门文章

最新文章