`
nsrainbow
  • 浏览: 735 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

第23讲 --使用Spring注解方式管理事务与传播行为详解

阅读更多
事务传播属性
REQUIRED:业务方法需要在一个事务中运行。如果方法运行时,已经处在一个事务中,那么加入到该事务,否则为自己创建一个新的事务。

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

REQUIRESNEW:属性表明不管是否存在事务,业务方法总会为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务会被挂起,新的事务会被创建,直到方法执行结束,新事务才算结束,原先的事务才会恢复执行。
MANDATORY:该属性指定业务方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。如果业务方法在没有事务的环境下调用,容器就会抛出例外。

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

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

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

知识点:
1.Spring容器如果碰到运行期异常,也就是RuntimeException 会回滚,如果是用户定义的例外则不会回滚,这个特性是默认的,不过也可以更改

例子:

Java代码
public void delete(Integer personid) {  
        jdbcTemplate.update("delete from person where id=?", new Object[]{personid},  
                new int[]{java.sql.Types.INTEGER});  
          
        throw new RuntimeException("运行期例外!");  
    } 

public void delete(Integer personid) {
jdbcTemplate.update("delete from person where id=?", new Object[]{personid},
new int[]{java.sql.Types.INTEGER});

throw new RuntimeException("运行期例外!");
}

测试:

Java代码
public void testDelete(){  
    personService.delete(4);  


public void testDelete(){
personService.delete(4);
} 结果:
id 为4 的记录没有被删除,事务回滚!

如果在实现里面throw new RuntimeException("非运行期例外!"); 则事务不回回滚,记录4被删除


我们可以使用注解来改变回滚的默认方式:
a.默认情况发生RuntimeException要回滚,改变为不回滚
Java代码
@Transactional(noRollbackFor=RuntimeException.class)  
    public void delete(Integer personid) {  
        jdbcTemplate.update("delete from person where id=?", new Object[]{personid},  
                new int[]{java.sql.Types.INTEGER});  
          
        throw new RuntimeException("运行期例外");  
    } 

@Transactional(noRollbackFor=RuntimeException.class)
public void delete(Integer personid) {
jdbcTemplate.update("delete from person where id=?", new Object[]{personid},
new int[]{java.sql.Types.INTEGER});

throw new RuntimeException("运行期例外");
} b.发生非RuntimeException不回滚,改变为回滚
@Transactional(rollbackFor=Exception.class)

c.如果不希望业务方法开启事务,比如select等方法可以
@Transactional(propagation=Propagation.NOT_SUPPORTED)

d.设置事务的超时时间
@Transactional(timeout=500)  /*依赖与底层数据库的实现*/


 
数据库系统提供了四种事务隔离级


数据库系统提供了四种事务隔离级别供用户选择。不同的隔离级别采用不同的锁类型来实现,在四种隔离级别中,Serializable的隔离级别最高,Read Uncommited的隔离级别最低。大多数据库默认的隔离级别为Read Commited,如SqlServer,当然也有少部分数据库默认的隔离级别为Repeatable Read ,如Mysql
Read Uncommited:读未提交数据(会出现脏读,不可重复读和幻读)。
Read Commited:读已提交数据(会出现不可重复读和幻读)
Repeatable Read:可重复读(会出现幻读)
Serializable:串行化
脏读:一个事务读取到另一事务未提交的更新新据。

不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同。换句话说就是,后续读取可以读到另一事务已提交的更新数据。相反,“可重复读”在同一事务中多次读取数据时,能够保证所读数据一样,也就是,后续读取不能读到另一事务已提交的更新数据。

幻读:一个事务读取到另一事务已提交的insert数据。

分享到:
评论

相关推荐

    Spring学习笔记(17)----使用Spring注解方式管理事务

    在本篇Spring学习笔记中,我们将探讨如何使用Spring框架的注解方式来管理事务,这是一种在现代Java应用中广泛采用的方法。Spring框架以其强大的依赖注入和面向切面编程能力,为事务管理提供了简洁且高效的解决方案。...

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

    在Spring框架中,声明式事务管理是其核心特性之一,它允许开发者无需手动处理事务的开始、提交、回滚等操作,而是通过配置或者注解的方式进行声明,从而简化了事务管理的复杂性。本篇文章将深入探讨如何使用Spring的...

    spring 注解事务管理

    在Spring框架中,注解事务管理是一种非常便捷的方式,它允许开发者通过在方法上添加特定的注解来声明式地管理事务。这种方式极大地简化了事务的配置,使得代码更加清晰和易于维护。以下是对"spring注解事务管理"这一...

    Spring学习笔记(18)----使用Spring配置文件实现事务管理

    这篇"Spring学习笔记(18)----使用Spring配置文件实现事务管理"着重讲解如何通过Spring的XML配置来管理应用中的事务。这里我们将深入探讨相关知识点。 首先,Spring提供了两种事务管理方式:编程式事务管理和声明式...

    Spring学习笔记(15)----使用Spring的注解方式实现AOP

    在本篇Spring学习笔记中,我们将深入探讨如何利用Spring框架的注解方式来实现面向切面编程(AOP)。AOP是一种编程范式,它允许我们定义横切关注点,如日志、事务管理等,然后将这些关注点模块化并插入到应用程序的多...

    Spring中事务的传播属性详解

    本文将详细介绍Spring中的事务传播属性,并通过具体的例子来解释每种传播行为的特点。 #### 二、事务传播属性概述 事务传播行为(Propagation)定义了当一个事务方法被另一个事务方法调用时的行为。在Spring中,...

    spring 事务基于注解模式

    使用Spring JDBC与事务管理 Spring JDBC模块提供了`JdbcTemplate`和`SimpleJdbcInsert`等工具类,它们已经封装了基本的数据库操作。在这些工具类中进行操作时,可以结合`@Transactional`注解进行事务管理。 例如...

    spring注解 -----最简单的注解与自动装配例子

    在Spring框架中,注解是实现依赖注入(Dependency Injection,DI)的一种重要方式,极大地简化了配置文件,提高了代码的可读性和可维护性。本篇文章将深入探讨Spring中的注解,以及如何通过注解进行自动装配。 首先...

    spring注解事务实现demo

    注解中可以包含多个属性,如`value`(指定事务管理器)、`propagation`(事务传播行为)、`isolation`(事务隔离级别)、`readOnly`(是否只读事务)等,以定制事务的行为。 3. **事务传播行为** 事务传播行为定义...

    spring注解式事务

    "spring注解式事务" Spring框架提供了基于注解的方式来管理事务,使用@Transactional注解来标记...Spring框架提供了灵活的方式来管理事务,开发者可以根据实际情况选择合适的事务传播行为和隔离级别来满足业务需求。

    Spring在Transaction事务传播行为种类

    ### Spring中的Transaction事务传播行为种类详解 #### 一、引言 在开发基于Spring框架的应用程序时,事务管理是确保数据一致性的重要手段之一。Spring框架提供了丰富的事务管理功能,其中包括了事务传播行为...

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

    总结一下,Spring事务管理提供了XML配置和注解两种方式,使得开发者能够灵活地控制事务的边界和行为。XML方式适合于传统应用,而注解方式则更加简洁,易于理解和维护。无论选择哪种方式,Spring事务管理都能帮助我们...

    Spring 4 + Mybatis 3 注解事务

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

    spring注解使用详解

    【Spring注解使用详解】 Spring框架自2.5版本开始,引入了注解配置,使得开发者可以在不依赖XML配置文件的情况下实现Bean的定义和依赖注入。注解配置因其简洁、直观的特点,逐渐成为主流的配置方式。在本文中,我们...

    Spring事务管理Demo

    2. **声明式事务管理**:这是Spring最常用的方式,通过在配置文件或者使用`@Transactional`注解来定义事务边界,使得事务管理与业务逻辑分离,降低了代码的耦合度。`@Transactional`注解可以应用于方法级别,表示该...

    SpringJDBC注解事务.zip

    `propagation`定义事务传播行为,如REQUIRED、REQUIRES_NEW等;`isolation`设置事务隔离级别;`rollbackFor`指定哪些异常应导致回滚;`noRollbackFor`指明哪些异常不应导致回滚。 - **使用示例**:在Service层的...

    spring 事务传播 demo

    本示例“spring 事务传播 demo”将聚焦于Spring的事务传播行为,这是在多个方法调用中控制事务边界的关键概念。下面我们将详细讨论相关知识点。 首先,事务传播行为是指当一个被@Transactional注解的方法被另一个@...

    Spring+Hibernate注解事务实例

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

    spring几种事务配置详解【精】

    Spring支持七种事务传播行为: - `REQUIRED`:如果当前没有事务,就新建一个;如果已经存在一个事务,则加入到这个事务中。 - `SUPPORTS`:如果当前存在事务,就加入;如果没有事务,则不开启。 - `MANDATORY`:...

    小码农的代码(二)----------SpringJDBC事务控制

    这些工具类通过预编译的SQL语句和参数绑定,有效地防止了SQL注入,并提供了异常处理机制,与事务管理紧密结合,确保了数据库操作的正确性。 总的来说,Spring JDBC事务控制是Spring框架中的重要组成部分,它提供了...

Global site tag (gtag.js) - Google Analytics