`

Spring中注解事务方面的问题

阅读更多
我们可以在spring的配置文件beans.xml中对事务进行注解配置,这样在相应的类中就不用对事务进行管事,对于某个类,想单独交给spring来管理,那么就在相应的类上加入@Transactional来标记事务。

在默认情况下spring对于运行时的异常RuntimeException,是会进行回滚操作,如果在相应的方法上面加入@Transactional(noRollbackFor =RuntimeException.class),表示对于出现RuntimeException这样的异常不进行回滚,就可以改变spring默认事务的行为,而不对事务进行回滚。

spring对于Exception异常,默认是不会回滚的,如果相让Spring来改变这种默认的行为,那么可以在相应的方法上面加入@Transactional(rollbackFor=Exception.class)设置成回滚,从而改变默认的行为。


Spring的几种注解事务传播行为

Required:业务方法需要在一个事务中运行。如果方法运行时,已经在一个事务中,那么加入到该事务,否则自己创建一个新的事务。一般spring默认都是这种事务,像保存,删除,修改等都是这种事务。80%的情况下都用这种事务。

Not_Supported:声明方法不需要事务。如果方法没有关联到一个事务,容器不会为它开启事务。如果方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会执行。

Requiresnew:属性不管是否存在事务,业务方法总会为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务被挂起,新的事务会被创建,直到方法执行结束,新事务才算结束,原先事务才会恢复执行。


Mandatory:该属性指定业务方法必须在一个事务中运行,业务方法不能发起自己的事略。如果业务方法在没有事务的环境下调用,容器会抛出例外。


Supports:这一事务属性表明,如果方法在某个事务范围内被调用,则方法成为该事务的一部分。如果业务方法在事务范围外被调用,则方法在没有事务的环境下执行。


Never:指定业务方法绝对不能在事务范围内执行。如果业务方法在某个事务中执行,容器会抛出例外,只有业务方法没有关联到任何事务,才能正常执行。


上面的事略在ejb中都会存在。只有下面的事务才是spring自己提供的。


Nested:如果一个活动的事务存在,则运行在一个嵌套的事务中,如果没有活动事务,则按Required属性执行,它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响,它只对DataSourceTransactionManager事务管理器起效。


Connection conn = null;
try {
    conn.setAutoCommit(false);
    Statement stmt = conn.createStatement();
    stmt.executeUpdate("update person set name='888' where id=1");
    Savepoint savepoint = conn.setSavepoint();//外部事务会设置一个保存点。
//---------------------------------------在内部事略中出现错误,是不会影响外部事务的运行.同种外部事务如果出错,也不会影响内部事务的执行.这就是NESTED事务.我们通过@Resource注入的事务就是这种形式的事务
    try{   
            conn.createStatement().executeUpdate("update person set name='222' where sid=2");
    }catch(Exception ex){
            conn.rollback(savepoint);    
     }
//---------------------------------------
      stmt.executeUpdate("delete from person where id=9");
      conn.commit();
       stmt.close();
    } catch (Exception e) {
         conn.rollback();
     }finally{
               try {
	    if(null!=conn && !conn.isClosed()) conn.close();
                } catch (SQLException e) { e.printStackTrace(); }
     }
}






分享到:
评论

相关推荐

    spring boot注解事务+多线程

    首先,让我们关注"注解事务"。在Spring框架中,我们主要依赖`@Transactional`注解来声明事务边界。当一个方法被这个注解标记时,Spring会自动管理事务的开始、提交或回滚。如果方法中发生任何未捕获的异常,事务将被...

    spring注解事务实现demo

    不过,这并不意味着在只读事务中不能执行更新操作,只是提示Spring可以优化事务处理。 6. **异常回滚规则** 默认情况下,如果在`@Transactional`方法中抛出未检查异常(继承自`RuntimeException`的异常)或者`...

    spring 注解事务管理

    以下是对"spring注解事务管理"这一主题的详细解释。 ### 1. Spring事务管理的基本概念 Spring事务管理主要分为两种方式:编程式事务管理和声明式事务管理。编程式事务管理是通过编写代码来控制事务的开始、提交、...

    spring 事务基于注解模式

    在上述例子中,`createUser`方法会被包裹在一个事务中,如果其中一个数据库操作失败,整个事务都会回滚。 ### 4. 检查点和回滚 Spring默认会在出现未捕获的运行时异常时回滚事务。通过`rollbackFor`和`...

    SpringJDBC注解事务.zip

    通过上述内容,我们可以看到Spring JDBC结合注解事务管理,极大地简化了事务控制,让开发更高效,同时也保持了代码的整洁性。在实际项目中,结合Spring的AOP(面向切面编程)和IoC(依赖注入)特性,事务管理变得...

    关于SpringMyBatis纯注解事务不能提交的问题分析与解决

    然而,在实际开发过程中,可能会遇到使用Spring MyBatis纯注解方式配置的事务无法正常提交的情况,尤其是在使用Oracle数据库时更为常见。 ### 问题描述 本文主要针对在Spring + MyBatis环境下,或使用Spring JDBC...

    spring中注解的实现原理

    Spring注解的处理主要由两部分组成:元注解和注解处理器。元注解是用于创建其他注解的注解,如`@Target`、`@Retention`、`@Documented`和`@Inherited`,它们定义了注解的使用位置、生命周期、是否出现在Javadoc中...

    Spring+Hibernate注解事务实例

    本实例将深入探讨如何结合Spring的注解声明式事务管理与Hibernate的数据访问技术,构建一个完整的事务处理系统。 Spring框架以其灵活的依赖注入(DI)和面向切面编程(AOP)闻名,它允许开发者将事务管理从业务逻辑...

    Spring 4 + Mybatis 3 注解事务

    Spring 与 各框架的组各下来,版本就特别的多,针对简单的 使用注解来管理事务的,研究了两天,要不网上写的不清楚,要不版本都很旧了,所以就是不回滚,Spring 的配置太灵活了,在加上新手,根本就不可能明白Spring...

    Spring java注解,元注解和自定义注解

    以下是一些常用的Spring注解: 1. **@Component** - 用于标记一个类作为Spring管理的Bean。 - 可以配合@ComponentScan注解使用,自动扫描指定包下的所有组件。 2. **@Service** - 特别适用于业务逻辑层的服务...

    spring简单注解+log4j记录日志

    AOP是Spring框架的一个重要特性,允许我们在不修改源代码的情况下,通过"切面"来关注代码中的横切关注点,如事务管理、日志记录等。我们可以创建一个切面类,使用`@Aspect`注解,并在其中定义通知(advice),如`@...

    spring注解式事务

    "spring注解式事务" Spring框架提供了基于注解的方式来管理事务,使用@Transactional注解来标记需要事务管理的方法。该注解可以被应用于public方法上,对于非public方法,如果标记了@Transactional也不会报错,但...

    spring事务,xml方式和注解方式

    在这个例子中,`createUser`方法会被Spring自动包裹在一个事务中,如果在执行过程中出现异常,事务会被回滚,确保数据一致性。 此外,Spring还支持在XML配置中声明事务行为。这种方式通常在没有使用注解的环境中...

    使用Spring的注解方式实现AOP的细节

    以上就是Spring注解方式实现AOP的一些核心细节。通过这种方式,我们可以方便地在不修改原有代码的情况下,为服务添加额外的功能,实现代码的解耦和复用。不过,需要注意的是,过度使用AOP可能会导致代码可读性和可...

    spring aop注解版

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、事务管理等。在本主题中,我们将深入探讨Spring AOP的注解版,它是基于Java注解的...

    spring基于注解实现事务

    如果只应用于特定方法,则只有被注解的方法在事务中执行。 1. **事务属性**: - **propagation**:定义事务的传播行为,如REQUIRED(默认,如果当前存在事务则加入,否则新建)、REQUIRES_NEW(总是新建事务,如果...

    spring3 struts2 Mybatis3 组件注解 事务注解 实例

    同时,Mybatis3也支持使用`@Transactional`注解进行局部事务控制,但通常在Spring环境中,全局事务管理由Spring负责。 在这个"spring3+struts2+Mybatis3"的实例中,你将学习如何集成这三个框架,创建一个完整的Java...

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

    当应用于类时,该类的所有公共方法都将包含在事务中。若应用于方法,只有该方法及其子方法才会被事务管理。注解中的属性包括`propagation`(事务传播行为)、`isolation`(隔离级别)、`readOnly`(只读事务)、`...

    spring自定义注解样例

    总结来说,Spring自定义注解和AOP的结合使用,让我们能够灵活地在代码中插入跨切面的关注点,如日志记录、事务管理、性能监控等,而不必在每个方法中手动添加这些代码。这不仅提高了代码的整洁度,也使得系统更加...

Global site tag (gtag.js) - Google Analytics