`

Spring事务不起作用原因

阅读更多

查询不需要事务控制

 

复杂的”修改+插入+删除“混合操作,需要事务控制,一般建议存储过程完成,可直接在存储过程中完成异常时候的回滚

 

所以最有可能需要事务处理的就是普通的插入、修改、删除(影响数据一致性的行为),这一部分是spring事务控制处理的核心部分

 

 

根据mvc设计建议,一般会在action层做业务流转处理,在service层做业务内容处理和调用,通过dao层获取数据模型,由于业务处理的核心多在service层,因此spring的事务管理一般多针对service进行配置,同样一些潜在业务处理异常的日志处理也都会在service产生,而在action层做一些异常跳转的处理,因此,常规做法:

 

1:在service层try catah各种业务异常,做异常返回结果处理,日志处理等

 

2:在action层捕获service层异常处理的结果,做异常跳转处理

 

 

但是这样一来,会产生冲突,spring配置的service层事务管理就是去了作用,为什么?因为默认spring只在发生未被捕获的runtimeexcetpion时才回滚,spring事务回滚要求抛出异常,如果try catch捕获了,spring没办法知道在哪里事务回滚了。 

 

spring aop  异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获runtimeexception的异常,但可以通过<tx:method name="upd*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>配置来捕获特定的异常并回滚。换句话说在service的方法中不使用try catch 或者在catch中最后加上throw new runtimeexcetpion(),这样程序异常时才能被aop捕获进而回滚

 

 

怎样两者兼得呢,既能保证业务错误的到及时捕捉和日志记录,又能避免异常产生脏数据,让spring的事务管理起作用,综合查找网上的方案:

 

 

在service层需要事务控制的方法的catch语句中处理完业务日记操作后增加:

 

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(),手动回滚;或者在catch语句中最后增加throw new RuntimeException()语句再次抛出异常。

 

 

这样基本就可以解决大部分情况了,但是如果需要在catch异常时对数据库操作,那么spring不会区别这部分是有用功,一视同仁的清理掉了,所以这里要起另外一个事务来处理那些有用功,并且手动提交掉。也可以使用如下方法做处理:在service层上再套一层,该层不做事务控制,有用功就写在该层。需事务控制的仍保留在下层。

 

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="dataSource" />
</bean>
 
 <tx:advice id="txAdvice" transaction-manager="transactionManager">
  <tx:attributes>
	   <tx:method name="add*" propagation="REQUIRED" />
	   <tx:method name="upd*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/>
	   <tx:method name="del*" propagation="REQUIRED" />
	   <tx:method name="*" propagation="SUPPORTS" />
   </tx:attributes>
 </tx:advice>
 
 <aop:config>
	 <aop:pointcut id="tranpc" expression="execution(* com.union.youtoo.manage.service.*.*(..))|| execution(* com.union.youtoo.www.service.*.*(..))"/>
	 <aop:advisor advice-ref="txAdvice" pointcut-ref="tranpc" />
 </aop:config>

 

分享到:
评论

相关推荐

    请教:spring事务不起作用

    然而,在实际开发中,有时我们可能会遇到"Spring事务不起作用"的问题。这个问题可能是由多种原因引起的,包括但不限于配置错误、事务注解使用不当、事务传播行为理解有误等。下面我们将深入探讨这些可能的原因,并...

    Spring事务管理失效原因汇总

    标题“Spring事务管理失效原因汇总”指出了本文的核心内容是分析在使用Spring框架进行事务管理时可能遇到的问题及其原因。描述部分进一步说明了事务失效的后果往往不明显,容易在测试环节被忽略,但在生产环境中出现...

    Spring事务管理Demo

    Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何实现事务的管理。 首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 ...

    spring事务与数据库操作

    ### Spring事务与数据库操作 #### 一、Spring的声明式事务管理 在现代软件开发中,事务处理是非常关键的一部分,特别是在涉及多个数据操作时。Spring框架提供了强大的事务管理能力,可以方便地集成到应用程序中。...

    Spring事务流程图

    Spring事务管理是Spring框架的核心特性之一,主要用于处理应用程序中的数据一致性问题。在Spring中,事务管理分为编程式和声明式两种方式。本篇文章将详细解释Spring事务管理的流程,以及如何通过时序图来理解这一...

    Spring事务原理、Spring事务配置的五种方式

    Spring事务原理和配置 Spring事务原理是指Spring框架中的一种机制,用于管理事务,并提供了多种配置方式。事务是指一系列的操作,作为一个整体执行,如果其中某个操作失败,整个事务将回滚。Spring事务原理围绕着两...

    spring 事务传播 demo

    在Spring框架中,事务管理是核心特性之一,它允许开发者以声明式或编程式的方式处理事务。本示例“spring 事务传播 demo”将聚焦于Spring的事务传播行为,这是在多个方法调用中控制事务边界的关键概念。下面我们将...

    Spring中事务的传播属性详解

    ### Spring中事务的传播属性详解 #### 一、引言 在使用Spring框架进行应用程序开发时,事务管理是一项非常重要的特性。Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。其中,声明式事务管理因其...

    Spring事务详细讲解

    Spring事务详细讲解 在 Spring 框架中,事务管理扮演着非常重要的角色。Spring 声明式事务让我们从复杂的事务处理中得到解脱,使得我们再也无需要去处理获得连接、关闭连接、事务提交和回滚等这些操作。再也无需要...

    Spring 事务简单完整例子

    本文将深入探讨在Spring框架中如何管理事务,以“Spring 事务简单完整例子”为出发点,结合标签“spring,事务,jdbc事务”,我们将详细解释Spring事务管理的原理和实践。 首先,Spring提供了两种事务管理方式:编程...

    Spring事务管理开发必备jar包

    本资源包提供了进行Spring事务管理开发所需的所有关键库,包括框架基础、核心组件、AOP(面向切面编程)支持、日志处理、编译工具以及与数据库交互的相关jar包。下面将对这些知识点进行详细解释: 1. **Spring框架*...

    Spring事务小demo

    这个名为"Spring事务小demo"的项目提供了一个实践示例,帮助开发者了解Spring事务处理的基本概念和用法。 首先,Spring事务管理是Spring框架的核心特性之一,它允许我们以声明式或编程式的方式管理事务。声明式事务...

    spring事务案例分析.zip

    本主题将深入探讨“Spring事务案例分析.zip”中的关键知识点,包括Spring事务管理及其在实际项目中的应用。 首先,我们来了解什么是Spring事务管理。在分布式系统或数据库操作中,事务管理是确保数据一致性和完整性...

    spring事务操作试验

    本文将深入探讨在"spring事务操作试验"中涉及的关键知识点,并结合提供的资源进行详细阐述。 首先,Spring事务管理的核心概念是ACID(原子性、一致性、隔离性和持久性),这是所有事务系统的基础。在Spring中,事务...

    实验 spring 声明事务

    Spring 提供了声明式事务管理,允许开发者在不编写事务管理代码的情况下实现事务控制,极大地简化了事务处理。 实验环境主要包括 Eclipse 或 MyEclipse 开发工具,以及 Spring 4.0 及以上版本,JDK 1.7 及以上版本...

    Spring事务传播机制.docx

    当我们在使用 Spring 所提供的事务功能时,如果是仅仅处理单个的事务,是比较容易把握事务的提交与回滚,不过一旦引入嵌套事务后,多个事务的回滚和提交就会变得复杂起来,各个事务之间是如何相互影响的,是一个值得...

    SPRING事务机制DEMO

    Spring事务机制是Java开发中非常重要的一个概念,它在企业级应用中扮演着核心角色,确保数据的一致性和完整性。Spring提供了多种事务管理方式,包括编程式事务管理和声明式事务管理。在这篇DEMO中,我们将重点探讨...

    Spring事务传播Demo.zip

    本篇将基于"Spring事务传播Demo"来深入探讨Spring事务管理和传播行为。 首先,我们需要理解什么是事务。在数据库操作中,事务是一组操作,这些操作要么全部执行,要么全部不执行,以确保数据的一致性和完整性。在...

    Spring事务管理的jar包

    本篇将深入探讨Spring事务管理的核心概念、工作原理以及如何使用`spring-tx-3.2.0.RELEASE.jar`这个jar包。 首先,我们需要理解什么是事务。在数据库系统中,事务是一组操作,这些操作被视为一个整体,要么全部完成...

Global site tag (gtag.js) - Google Analytics