spring事务失效情况分析

简介:

<!--[if !supportLists]-->一、<!--[endif]-->声明式事务和注解事务并存的情况下,事务失效。

 

该情况常见配置如下:

 

<!--事务声明-->

<bean name="transactionManager"

    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

       <property name="dataSource" ref="dataSource"></property>

    </bean>

<!--声明式事务 –->

<tx:advice id="txAdvice" transaction-manager="transactionManager">

       <tx:attributes>

           <tx:method name="insert*" propagation="REQUIRED" read-only="false"

              rollback-for="java.lang.Exception" />

           <tx:method name="save*" propagation="REQUIRED" read-only="false"

              rollback-for="java.lang.Exception" />

           <tx:method name="update*" propagation="REQUIRED" read-only="false"

              rollback-for="java.lang.Exception" />

           <tx:method name="modify*" propagation="REQUIRED" read-only="false"

              rollback-for="java.lang.Exception" />

           <tx:method name="delete*" propagation="REQUIRED" read-only="false"

              rollback-for="java.lang.Exception" />

           <tx:method name="find*" propagation="SUPPORTS" />

           <tx:method name="get*" propagation="SUPPORTS" />

           <tx:method name="select*" propagation="SUPPORTS" />

       </tx:attributes>

    </tx:advice>

   

    <aop:config>

       <aop:pointcut id="pc"

           expression="execution(* com.suning.sop.*.service.*(..))" />

       <aop:advisor advice-ref="txAdvice" pointcut-ref="pc" />

    </aop:config>

 

<!—注解式事务 –->

<tx:annotation-driven

proxy-target-class="true"

transaction-manager="transactionManager"/>

 

 

 

解决方法:声明优先级,order,值越大优先级越低

将上例中,<aop:config>节点修改成如下所示

    <aop:config>

       <aop:pointcut id="pc"

           expression="execution(* com.suning.sop.*.service.*(..))" />

       <aop:advisor advice-ref="txAdvice" pointcut-ref="pc" order="1"/>

    </aop:config>

 

<!--[if !supportLists]-->二、<!--[endif]-->ControllerService层和Dao层全部使用注解生成benaService层方法也使用注解声明事,这种情况由于 @Controller 会把 关联的@Servie自动实例化,而此时Service层中声明的事务并没有被实例化,导致事务失效。

解决方法:

 

<context:component-scan base-package="com.comtop"  use-default-filters="false" >

        <context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>    

</context:component-scan>    

  

<context:component-scan base-package="com.comtop">    

        <context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/>    

</context:component-scan>   

Include:把@Controller关联的@Service自动实例化

exclude:屏蔽@Service自动实例化

<!--[if !supportLists]-->三、<!--[endif]-->三层都使用注解,事务也使用注解声明。事务失效

Spring 会先加载声明在xml文件中的Bean

其次是加载<context:component-scan>标签声明的包中,

声明了@Controller,@Service,@Component,@Re @Repository的类

最后是 @Transactional 标记,但上一步处理component-scan 声明的包时,类包含的@Transactional标记没有被处理,所以事务控制失效。

 

解决方法:

 

Service 层的类使用xml文件声明bean,但是事务控制仍然使用@Transactional注解来声明,事务控制才能生效


特别说明:尊重作者的劳动成果,转载请注明出处哦~~~
相关文章
|
30天前
|
Java 关系型数据库 数据库
深度剖析【Spring】事务:万字详解,彻底掌握传播机制与事务原理
在Java开发中,Spring框架通过事务管理机制,帮我们轻松实现了这种“承诺”。它不仅封装了底层复杂的事务控制逻辑(比如手动开启、提交、回滚事务),还提供了灵活的配置方式,让开发者能专注于业务逻辑,而不用纠结于事务细节。
|
6月前
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——常见问题总结
本文总结了Spring Boot中使用事务的常见问题,虽然通过`@Transactional`注解可以轻松实现事务管理,但在实际项目中仍有许多潜在坑点。文章详细分析了三个典型问题:1) 异常未被捕获导致事务未回滚,需明确指定`rollbackFor`属性;2) 异常被try-catch“吃掉”,应避免在事务方法中直接处理异常;3) 事务范围与锁范围不一致引发并发问题,建议调整锁策略以覆盖事务范围。这些问题看似简单,但一旦发生,排查难度较大,因此开发时需格外留意。最后,文章提供了课程源代码下载地址,供读者实践参考。
136 0
|
6月前
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——Spring Boot 事务配置
本文介绍了 Spring Boot 中的事务配置与使用方法。首先需要导入 MySQL 依赖,Spring Boot 会自动注入 `DataSourceTransactionManager`,无需额外配置即可通过 `@Transactional` 注解实现事务管理。接着通过创建一个用户插入功能的示例,展示了如何在 Service 层手动抛出异常以测试事务回滚机制。测试结果表明,数据库中未新增记录,证明事务已成功回滚。此过程简单高效,适合日常开发需求。
894 0
|
6月前
|
Java 数据库 微服务
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——事务相关
本文介绍Spring Boot事务配置管理,阐述事务在企业应用开发中的重要性。事务确保数据操作可靠,任一异常均可回滚至初始状态,如转账、购票等场景需全流程执行成功才算完成。同时,事务管理在Spring Boot的service层广泛应用,但根据实际需求也可能存在无需事务的情况,例如独立数据插入操作。
134 0
|
4月前
|
人工智能 Java 数据库连接
Spring事务失效场景
本文深入探讨了Spring框架中事务管理可能失效的几种常见场景及解决方案,包括事务方法访问级别不当、方法内部自调用、错误的异常处理、事务管理器或数据源配置错误、数据库不支持事务以及不合理的事务传播行为或隔离级别。通过合理配置和正确使用`@Transactional`注解,开发者可以有效避免这些问题,确保应用的数据一致性和完整性。
226 10
|
3月前
|
Java 关系型数据库 MySQL
【Spring】【事务】初学者直呼学会了的Spring事务入门
本文深入解析了Spring事务的核心概念与使用方法。Spring事务是一种数据库事务管理机制,通过确保操作的原子性、一致性、隔离性和持久性(ACID),维护数据完整性。文章详细讲解了声明式事务(@Transactional注解)和编程式事务(TransactionTemplate、PlatformTransactionManager)的区别与用法,并探讨了事务传播行为(如REQUIRED、REQUIRES_NEW等)及隔离级别(如READ_COMMITTED、REPEATABLE_READ)。
279 1
|
3月前
|
负载均衡 Java API
基于 Spring Cloud 的微服务架构分析
Spring Cloud 是一个基于 Spring Boot 的微服务框架,提供全套分布式系统解决方案。它整合了 Netflix、Zookeeper 等成熟技术,通过简化配置和开发流程,支持服务发现(Eureka)、负载均衡(Ribbon)、断路器(Hystrix)、API网关(Zuul)、配置管理(Config)等功能。此外,Spring Cloud 还兼容 Nacos、Consul、Etcd 等注册中心,满足不同场景需求。其核心组件如 Feign 和 Stream,进一步增强了服务调用与消息处理能力,为开发者提供了一站式微服务开发工具包。
483 0
|
5月前
|
SQL 前端开发 Java
深入分析 Spring Boot 项目开发中的常见问题与解决方案
本文深入分析了Spring Boot项目开发中的常见问题与解决方案,涵盖视图路径冲突(Circular View Path)、ECharts图表数据异常及SQL唯一约束冲突等典型场景。通过实际案例剖析问题成因,并提供具体解决方法,如优化视图解析器配置、改进数据查询逻辑以及合理使用外键约束。同时复习了Spring MVC视图解析原理与数据库完整性知识,强调细节处理和数据验证的重要性,为开发者提供实用参考。
252 0
|
2月前
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
730 0
|
6月前
|
前端开发 Java 数据库
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——Thymeleaf 介绍
本课介绍Spring Boot集成Thymeleaf模板引擎。Thymeleaf是一款现代服务器端Java模板引擎,支持Web和独立环境,可实现自然模板开发,便于团队协作。与传统JSP不同,Thymeleaf模板可以直接在浏览器中打开,方便前端人员查看静态原型。通过在HTML标签中添加扩展属性(如`th:text`),Thymeleaf能够在服务运行时动态替换内容,展示数据库中的数据,同时兼容静态页面展示,为开发带来灵活性和便利性。
307 0