`
feohoo
  • 浏览: 112568 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

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

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

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

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

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

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

NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按REQUIRED属性执行.它使用了一个单独的事务, 这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效
知识点:
1.Spring容器如果碰到运行期异常,也就是RuntimeException 会回滚,如果是用户定义的例外则不会回滚,这个特性是默认的,不过也可以更改
 
例子:
 
Java代码 复制代码
  1. public void delete(Integer personid) {   
  2.         jdbcTemplate.update("delete from person where id=?"new Object[]{personid},   
  3.                 new int[]{java.sql.Types.INTEGER});   
  4.            
  5.         throw new RuntimeException("运行期例外!");   
  6.     }  
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代码 复制代码
  1. public void testDelete(){   
  2.     personService.delete(4);   
  3. }  
 public void testDelete(){
		personService.delete(4);
	}
 结果:
id 为4 的记录没有被删除,事务回滚!
 
如果在实现里面throw new RuntimeException("非运行期例外!"); 则事务不回回滚,记录4被删除
 
我们可以使用注解来改变回滚的默认方式:
 a.默认情况发生RuntimeException要回滚,改变为不回滚
Java代码 复制代码
  1. @Transactional(noRollbackFor=RuntimeException.class)   
  2.     public void delete(Integer personid) {   
  3.         jdbcTemplate.update("delete from person where id=?"new Object[]{personid},   
  4.                 new int[]{java.sql.Types.INTEGER});   
  5.            
  6.         throw new RuntimeException("运行期例外");   
  7.     }  
@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事务优缺点及使用详解.docx

    【Spring 事务管理详解】 一、事务简介 事务是数据库操作的基本单位,它确保一组SQL语句要么全部成功,要么全部失败,以维护数据的一致性。在MySQL中,事务通常涉及INSERT、UPDATE、SELECT和DELETE等操作。当操作...

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

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

    spring事务详解

    Spring的事务管理还提供了强大的事务传播行为和隔离级别配置,开发者可以根据业务需求来设置事务如何在多个方法调用之间传播,以及事务之间的隔离程度,保证数据的一致性和隔离性。 在实际应用中,Spring事务管理的...

    Spring事务详解

    在Spring中,我们可以选择不同的事务传播行为,例如PROPAGATION_REQUIRED(默认)表示如果当前存在事务,则加入该事务,如果不存在则新建一个;PROPAGATION_REQUIRES_NEW表示始终新建一个事务,与当前事务无关等。...

    Spring声明式事务配置管理方法

    Spring提供了七种事务传播行为: - `PROPAGATION_REQUIRED`:如果存在事务,则加入;否则新建。 - `PROPAGATION_REQUIRES_NEW`:始终新建事务,如果已有事务则挂起。 - `PROPAGATION_SUPPORTS`:如果存在事务,...

    Hibernate缓存与spring事务详解

    3. **事务传播行为** - `@Transactional`的propagation属性定义了事务如何在不同方法间传播,如REQUIRED(默认,如果存在事务则加入,否则新建)、REQUIRES_NEW(总是新建事务)等。 4. **事务隔离级别** - 包括...

    Spring 事务隔离与事务传播的详解与对比

    Spring 事务隔离与事务传播的详解与对比 Spring是SSH中的管理员,负责管理其它框架,协调各个部分的工作。今天一起学习一下Spring的事务管理。Spring的事务管理分为声明式跟编程式。声明式就是在Spring的配置文件中...

    spring事务管理

    ### Spring事务管理详解 #### 一、事务管理基础概念 在深入探讨Spring事务管理之前,我们需要先理解什么是事务。事务可以被定义为一系列的操作集合,这些操作作为一个整体被提交或回滚。简单来说,事务就是一个不...

    Spring 事务详解面试

    注解用于声明事务的属性,比如事务的传播行为、隔离级别、回滚规则等。通过注解,开发者可以将事务管理逻辑从业务逻辑中分离出来。 编程式事务则需要开发者在代码中手动控制事务的开始、提交和回滚。虽然这种方法...

    spring编程式事务与声明式事务详解[参照].pdf

    **事务属性**是事务管理的核心部分,包括事务隔离级别和事务传播行为。 **事务隔离级别**决定了并发事务间的隔离程度,防止数据的不一致性和脏读。Spring的TransactionDefinition接口定义了五个常量来表示这些级别...

    Spring事务管理配置

    其中,事务管理是Spring框架中的一个重要组成部分,它使得开发者能够以声明式的方式管理应用程序中的事务,从而提高了代码的可读性和维护性。 ### Spring事务管理的基本原理 Spring的事务管理分为编程式和声明式两...

    spring事务管理.rar

    Spring事务管理是Spring框架的核心特性之一,它提供了一种强大且灵活的方式来管理应用程序中的事务边界。在企业级Java应用中,事务处理是确保数据一致性、完整性和可靠性的关键部分。本篇文章将深入探讨Spring的事务...

    spring事务配置的五种方式

    通过`transactionAttributes`属性,我们可以指定每个方法的事务传播行为和回滚规则等。 #### 四、其他四种事务配置方式简介 除了上述的第一种方式外,还有另外四种常见的事务配置方式,它们分别是: 1. **基于XML...

    详细介绍Spring事务管理

    在Spring中,声明式事务管理通常是通过在XML配置文件或Java配置类中使用`@Transactional`注解来实现的。例如: ```java @Service public class UserService { @Autowired private UserRepository userRepository...

Global site tag (gtag.js) - Google Analytics