`
爱像天空
  • 浏览: 205941 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

【Spring.事务.异常回滚】请问Spring的声明式事务发生异常时的处理方式。

    博客分类:
  • SSH
阅读更多
http://www.iteye.com/problems/17791

我的方法(使用伪代码表述):

Java代码
@Transactional 
public 一个业务方法(){  
  try{  
 
    //一些业务操作,期间可能会抛出运行时异常。  
     int i = 3/0;  
    ... ...  
      
    //调用A实体相关的dao方法,dao使用了Spring的DAO模版。 期间可能会出现事务冲突的问题。  
     aDao.oneMethod();  
    ... ...  
      
    //一些业务操作,期间可能会抛出运行时异常。  
     int i = 3/0;  
    if(某条件){  
      throw new 自定义的运行时异常();  
    }  
      
    ... ...  
     //调用B实体相关的dao方法,dao使用了Spring的DAO模版。 期间可能会出现事务冲突的问题。  
     bDao.oneMethod();  
     ... ...  
  }catch(Spring异常){  
 
    //做一些自定的操作。  
     ... ...  
  }  


@Transactional
public 一个业务方法(){
  try{

    //一些业务操作,期间可能会抛出运行时异常。
     int i = 3/0;
    ... ...
   
    //调用A实体相关的dao方法,dao使用了Spring的DAO模版。 期间可能会出现事务冲突的问题。
     aDao.oneMethod();
    ... ...
   
    //一些业务操作,期间可能会抛出运行时异常。
     int i = 3/0;
    if(某条件){
      throw new 自定义的运行时异常();
    }
   
    ... ...
     //调用B实体相关的dao方法,dao使用了Spring的DAO模版。 期间可能会出现事务冲突的问题。
     bDao.oneMethod();
     ... ...
  }catch(Spring异常){

    //做一些自定的操作。
     ... ...
  }
}

请问:
1. 在未调用dao方法之前,若出现了运行时异常,Spring还会做开启事务、关闭事务的动作吗?
2. 在调用aDao.oneMethod()之后、bDao.oneMethod()之前,出现运行时异常,会导致事务回滚吗?
3. 若在事务提交时出现了异常,事务在回滚后会继续抛出一个异常,虽然在我的程序中,事务抛出异常的概率较低,但是为了保险,我还是将我的业务方法的代码体用try...catch...块包了一层。请问有更好的处理方式吗?

一次问可能有点多,但是,对于比我聪明而又经验丰富的各位侠客来说就是小菜一碟了,谢谢了:)
问题补充:
补充:
对于第三点,那么,我如何捕获Spring事务抛出的异常呢?
问题补充:
谢谢各位的回复。
但是有点我不太明白,我没有看过Spring的事务的源代码,但是我认为的事务处理就是Spring环绕通知机制吧,效果应该相当于:
Java代码
try{  
     
   //开启事务  
   Transaction tx = session.beginTransactioin();  
     
  //回调我的service方法  
  myServiceMethod();  
 
  //提交事务  
  tx.commit();  
 
catch(某范围的异常){  
    
  //Spring对异常的一些自定义处理。  
  ... ...  


try{
  
   //开启事务
   Transaction tx = session.beginTransactioin();
  
  //回调我的service方法
  myServiceMethod();

  //提交事务
  tx.commit();

catch(某范围的异常){
 
  //Spring对异常的一些自定义处理。
  ... ...
}

因此——若我的理解是正确的话,在出现事务异常时,我的service方法myServiceMethod()是没法捕获事务的异常的,也就没法抛出我自定义的异常类。

表现层已经写好,由其他组维护,我不便改,而Action只捕获了公司的自定义异常及其子类异常,也就没法捕获Spring的DataAccessException。

请问还有什么好的处理方法吗?

1.  会。 spring的事务边界是在调用业务方法之前开始的,业务方法执行完毕之后来执行commit or rollback(取决于是否抛出runtime异常).
2.如果抛出runtime exception 并在你的业务方法中没有catch到的话,事务会回滚。
3.一般不需要在业务方法中catch异常,如果非要catch,在做完你想做的工作后(比如关闭文件等)一定要抛出runtime exception,否则spring会将你的操作commit,这样就会产生脏数据.所以你的catch代码是画蛇添足。
seagullgao (初级程序员) 2009-05-30
sping事务的exception一般在调用该service的action中catch,然后将结果导到出错页面,告诉user出差的原因。如果你想知道详细的出错原因,可以在spring的 service中抛出自定义exception,然后在出错页面中显示不同的出错message.
seagullgao (初级程序员) 2009-06-08
SPRING2.5中,HIBERNETTEMPLATE是线程和事务绑定的,这和spring2.0不一样,现在的数据库操作基类都是2.0的,在执行数据库变更操作时候会自动执行,然而在2.5中它不会,需要手动在绑定事务的hibernetTemplate上执行flush()
分享到:
评论

相关推荐

    Spring Boot多数据源(支持Spring声明式事务切换和回滚).pdf

    《Spring Boot多数据源(支持Spring声明式事务切换和回滚)》 Spring Boot多数据源技术是构建高效、灵活的多租户SaaS架构的关键。在本文中,我们将深入探讨如何实现动态数据源切换,支持Spring声明式事务管理,并讨论...

    spring 简单实例 事务回滚

    Spring 提供了声明式事务管理,这是通过在配置文件或使用注解来声明事务边界的方式。例如,我们可以使用`@Transactional`注解来标记一个方法为事务方法。当这个方法执行时,Spring会自动开启一个事务,执行方法内的...

    Spring事务管理A方法内部调用B方法的回滚问题测试代码

    在这个例子中,我们可能关注的是声明式事务管理,因为它是Spring中最常用的方式。 首先,我们需要在Spring配置文件中启用事务管理器,例如使用`<tx:annotation-driven>`标签。这将扫描带有@Transactional注解的方法...

    Spring声明式事务处理

    了解了这些基本概念后,我们就可以利用Spring声明式事务处理来确保我们的应用程序在处理数据时的正确性和一致性。通过配置或注解,我们可以轻松地在需要的地方启用事务管理,而无需在业务代码中编写复杂的事务控制...

    spring声明式事务处理demo

    在这个"spring声明式事务处理demo"中,我们将探讨如何在MyEclipse环境下实现这一功能。 首先,我们要理解Spring事务管理的两种主要方式:编程式事务管理和声明式事务管理。编程式事务管理通常通过AOP(面向切面编程...

    Spring事务管理只对出现运行期异常进行回滚

    Spring的事务管理默认遵循一种被称为“编程式事务管理”或“声明式事务管理”的策略。在大多数情况下,我们使用声明式事务管理,它基于AOP(面向切面编程)来控制事务的边界。 标题中提到的“Spring事务管理只对...

    4.Spring中的JdbcTemplate,Spring中的的事务,

    通过本章节的学习,您应该能够掌握如何使用JdbcTemplate进行基本的数据库操作,以及如何在Spring中配置和使用声明式事务来管理复杂的业务流程。这些技能对于开发基于Spring框架的应用程序至关重要。

    spring声明式事务管理配置方式

    在"spring声明式事务管理配置方式"中,主要涉及到以下几个关键知识点: 1. **Spring事务管理器(Transaction Manager)**: - Spring支持多种事务管理器,如DataSourceTransactionManager(用于JDBC事务)和...

    spring+mybatis的声明式事务

    Spring提供两种事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理通过编写代码来控制事务的开始、提交、回滚等操作,灵活性高但侵入性强。相比之下,声明式事务管理则更加简洁,它通过配置或注解来...

    Spring中的@Transactional事物回滚实例源码

    首先,`@Transactional`是Spring提供的一个编程式事务管理方式,它允许我们在方法上声明事务属性,如传播行为、隔离级别、读写模式以及是否回滚。例如: ```java @Service public class UserService { @...

    Spring中@Transactional事务回滚(含实例

    在Spring框架中,`@Transactional`注解是用于标记事务管理的重要工具,它使得开发者能够方便地在代码中声明式地控制事务的边界。本文将深入解析`@Transactional`的事务回滚机制,并通过实例来详细讲解其工作原理,...

    Hibernate编程式事务与Spring Aop的声明式事务(spring与hibernate集成)

    4. **异常处理**: 声明式事务管理基于异常驱动,当方法抛出未检查异常(继承自`RuntimeException`)或`Error`时,事务会自动回滚;而检查异常(非`RuntimeException`)则不会触发回滚,除非在注解中指定了`rollback...

    spring声明式事务.zip

    本文将深入探讨Spring声明式事务的实现机制、优缺点以及如何在实际项目中进行配置和使用。 1. **声明式事务管理概述** 声明式事务管理与编程式事务管理相对,后者需要开发者在代码中显式调用开始、提交、回滚等...

    spring事务异常回滚实例解析

    Spring 事务管理是其核心特性之一,主要用于在执行数据库操作时确保数据的一致性和完整性。...同时,合理地配置事务策略和处理异常的方式,可以确保在出现错误时正确地回滚事务,保证系统的稳定性和数据的一致性。

    实验 spring 声明事务

    1. **配置Spring声明式事务**: 在Spring中,声明式事务管理依赖于AOP(面向切面编程)来实现。首先,需要配置一个事务管理器,通常使用`DataSourceTransactionManager`,它与数据源`dataSource`关联。然后,通过`...

    全面分析_Spring_的编程式事务管理及声明式事务管理.

    本篇文章将深入探讨Spring中的两种主要事务管理方式:编程式事务管理和声明式事务管理。 1. 编程式事务管理: 编程式事务管理允许开发者直接在代码中控制事务的开始、提交、回滚等操作。这种方式具有较高的灵活性,...

    使用Spring的声明式事务----Annotation注解方式

    这是Spring声明式事务的核心注解,可以用于类或方法级别。当应用于类时,该类的所有公共方法都将包含在事务中。若应用于方法,只有该方法及其子方法才会被事务管理。注解中的属性包括`propagation`(事务传播行为)...

    使用Spring的声明式事务----AOP方式

    本文将深入探讨如何利用Spring的声明式事务来处理业务操作中的数据一致性问题,以及相关源码解析。 首先,我们需要了解Spring的AOP概念。AOP是一种编程范式,它允许程序员定义“切面”,这些切面可以包含业务逻辑的...

    spring声明事务的配置

    Spring声明式事务管理是Spring框架的核心特性之一,它允许开发者在不侵入业务代码的情况下,对应用程序的事务进行管理。这种方式极大地提高了代码的可维护性和灵活性。以下是对Spring声明式事务配置的详细说明: 1....

Global site tag (gtag.js) - Google Analytics