Spring中事务声明方式:1、基于XML配置:在applicationContext.xml中对类的方法统一配置;2、注解式(@Transactional)
关于配置不细说,之前博文里有写:
http://angelbill3.iteye.com/blog/1896502
在做DEMO的时候,一度发现注解式配置不起作用,后来才发现在applicationContext.xml中少了一句话,即启动Spring注解的声明。如下:
<tx:annotation-driven transaction-manager="transactionManager" />
加上之后注解式事务就能用了。
1、注解式的方式(@Transactional注解方式)优先级要高于在applicationContext.xml中对类的方法统一配置。原因很简单,后者算是统一配置,前者是具体灵活,可单独对某个类进行配置,优先级当然要高了。
2、Spring提供的事务管理器类有很多,在使用jdbc的抽象以及ibatis支持时可用以下类:org.springframework.jdbc.datasource.DataSourceTransactionManager
3、Spring事务传播行为:
propagation | 说明 |
REQUIRED | 如果有事务,那么加入事务,没有的话新创建一个 |
NOT_SUPPORTED | 这个方法不开启事务 |
REQUIREDS_NEW | 不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务 |
MANDATORY | 必须在一个已有的事务中执行,否则抛出异常 |
NEVER | 不能在一个事务中执行,就是当前必须没有事务,否则抛出异常 |
SUPPORTS | 其他bean调用这个方法,如果在其他bean中声明了事务,就是用事务。没有声明,就不用事务。 |
NESTED | 如果一个活动的事务存在,则运行在一个嵌套的事务中,如果没有活动的事务,则按照REQUIRED属性执行,它使用一个单独的事务。这个事务拥有多个回滚的保存点,内部事务的回滚不会对外部事务造成影响,它只对DataSource TransactionManager事务管理器起效。 |
另还可以设:
readOnly=true(只读事务),rollbackFor = ApplicationException.class(对具体的异常进行设置),timeout=30(超时时间),isolation=Isolation.DEFAULT(数据库隔离级别设置)等
4、下面重点就常用的几个用注解的方试写下实例
框架:Spring mvc + mybatis3
4.1 REQUIRED:最常用的事务传播
//ServiveA
@Transactional (propagation = Propagation.REQUIRED )
public void dealA(){
Article a = new Article();
a.setTitlename("1");
this.sql.insert("com.faj.dao.ArticleMapper.insert",a);//插入
serviceB.dealB();//调用另一个Service方法
}
//ServiceB
@Transactional (propagation = Propagation.REQUIRED )
public void dealB(){
Article a = new Article();
a.setTitlename("3");
this.sqlSession.insert("com.faj.dao.ArticleMapper.insert",a);
throw new ApplicationException();
//ApplicationException是一个继承RunTimeExcepiotn的异常处理类
}
//运行结果分析:-------------------------------------
(列举主要步骤)
以下信息是在LOG4J的DEBUG级别层打印。
[DEBUG] 2013-09-09 17:06:33 :Creating new transaction with name [com.service.impl.ServiceAImpl.dealA]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
[DEBUG] 2013-09-09 17:06:33 :Creating a new SqlSession
[DEBUG] 2013-09-09 17:06:33 :Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@54fe9ab3]
[DEBUG] 2013-09-09 17:06:33 :==> Preparing: insert into article (id, titlename, type, insertuser, inserttime, state, updateuser, updatetime, isdelete, indeximg, indexcontent, readcount, commit, support, content ) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
[DEBUG] 2013-09-09 17:06:33 :Participating in existing transaction
[DEBUG] 2013-09-09 17:06:33 :Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@54fe9ab3] from current transaction
[DEBUG] 2013-09-09 17:06:33 :==> Preparing: insert into article (id, titlename, type, insertuser, inserttime, state, updateuser, updatetime, isdelete, indeximg, indexcontent, readcount, commit, support, content ) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
[DEBUG] 2013-09-09 17:17:30 :Participating transaction failed - marking existing transaction as rollback-only
[DEBUG] 2013-09-09 17:17:30 :Setting JDBC transaction [com.mysql.jdbc.Connection@6aa0328b] rollback-only
[DEBUG] 2013-09-09 17:17:30 :Transaction synchronization rolling back SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@54fe9ab3]
第1行说明新建了事务,传播行为:PROPAGATION_REQUIRED
建立一个SqlSession(54fe9ab3)
第4行:类ServiceA的dealA方法中有insert方法,所以插入数据。
接着就是释放了联连。(此步骤略)
接下来就到了运行:serviceB.dealB();//调用另一个Service方法
因为事务的传播行为是PROPAGATION_REQUIRED(如果有事务,那么加入事务,没有的话新创建一个)
第6行:所以看出已经加入了已有的事务中了。(Participating in existing transaction)
第8行:类ServiceB的dealB方法中有insert方法,所以插入数据,
可以看出是同一个SESSIONID。
第10行,两个方法共享一个事务,此时,已把主事务标记成了rollback-only
类ServiceB的dealB方法中抛出unchecked异常。
注:RunTimeException属于unchecked异常,若抛出Exception(属checked异常),不会回滚。
所以在第12行,事务回滚。
因为是共享事务,所以两条插入语句都会回滚。
分享到:
相关推荐
Spring 事务传播机制 Spring 事务传播机制是指在 Spring 框架中,事务的传播和嵌套机制。当我们在使用 Spring 所提供的事务功能时,如果是仅仅处理单个的事务,是比较容易把握事务的提交与回滚,不过一旦引入嵌套...
本示例“spring 事务传播 demo”将聚焦于Spring的事务传播行为,这是在多个方法调用中控制事务边界的关键概念。下面我们将详细讨论相关知识点。 首先,事务传播行为是指当一个被@Transactional注解的方法被另一个@...
Spring提供了七种事务传播特性,每一种都有其特定的场景适用性。 1. **PROPAGATION_REQUIRED** - 这是最常用的传播行为。当使用此传播行为时,如果当前存在事务,则在该事务中执行;如果没有,则创建一个新的事务...
通过上述对Spring事务传播行为的详细介绍,我们可以看出,正确理解和应用这些传播行为对于构建健壮的事务管理机制至关重要。每种传播行为都有其特定的应用场景和限制条件,开发者应根据具体的业务逻辑和需求来合理...
### Spring事务的七大传播行为 ...总结来说,选择合适的事务传播行为和隔离级别对于确保应用程序的数据一致性至关重要。开发者需要根据业务需求权衡性能和数据一致性之间的关系,以选择最合适的设置。
本DEMO主要探讨的是Spring事务的传播行为和隔离级别,这些概念对于理解和优化数据库操作至关重要。让我们深入理解这些概念及其实际应用。 首先,我们来谈谈事务的传播行为。在Spring中,当一个方法被另一个具有事务...
Spring事务管理的核心是基于AOP(面向切面编程)来实现的。 **Spring事务的本质**实际上是依赖于底层数据库提供的事务支持。如果没有数据库层面的支持,Spring无法单独实现事务的功能。在传统的JDBC操作中,如果想...
Spring事务传播属性是这一机制的关键组成部分,它定义了在一个事务方法被另一个事务方法调用时,应该如何处理事务的边界。在深入理解Spring事务传播属性之前,我们首先需要了解Spring中的事务管理模型,包括编程式...
#### 一、Spring 事务传播机制 Spring 的事务管理功能非常强大,其中一个重要特性就是事务传播行为。事务传播行为定义了当一个方法调用另一个方法时,如何处理事务边界的问题。Spring 提供了七种不同的传播行为: ...
本文将深入探讨Spring事务管理的源码,理解其背后的实现机制。 首先,Spring事务管理有两种主要模式:编程式事务管理和声明式事务管理。编程式事务管理通过调用`PlatformTransactionManager`接口提供的方法进行显式...
总之,“Spring事物传播测试表”是学习和掌握Spring事务管理的重要工具。通过对各种传播行为的测试和分析,开发者能够更好地理解Spring事务的运作机制,从而在实际项目中编写出更加健壮和可靠的代码。在实际工作中,...
总的来说,Spring事务传播原理和数据库事务操作原理是Java开发人员必须掌握的核心知识。理解这些原理,能够帮助我们在开发过程中更好地处理数据一致性问题,保证系统的稳定性和可靠性。通过对Spring事务机制的熟练...
二、Spring事务传播机制: 1. REQUIRED:如果当前事务存在,则加入当前事务,如果当前事务不存在,则创建一个新的事务。 2. REQUIRES_NEW:总是创建一个新的事务,如果当前事务存在,则挂起当前事务。 3. SUPPORTS...
### Spring事务与数据库操作 #### 一、Spring的声明式事务管理 在现代软件开发中,事务处理是非常关键的一部分,特别是在涉及多个数据操作时。Spring框架提供了强大的事务管理能力,可以方便地集成到应用程序中。...
在讨论了代理模式、异常分类、方法权限后,文章还提到了Spring事务管理中事务的传播机制和隔离机制。事务的传播机制定义了事务的行为,例如是否在当前事务中执行或者创建一个新的事务。隔离机制定义了事务之间的隔离...
Spring 框架提供了一套完善的事务管理机制,其中包含了多种事务传播属性和事务隔离级别。这些特性使得在处理数据库操作时,能够更好地控制事务的边界和行为,从而确保数据的一致性和完整性。 首先,我们来看一下...
而"studyspring"可能是源代码目录,包含了实现这些案例的Java类和配置文件,通过阅读和学习这些代码,可以更深入地理解Spring事务的运用。 总结,Spring事务管理是其核心功能之一,它简化了事务处理的复杂性,使...
Spring还提供了事务传播行为,定义了在一个事务方法被另一个事务方法调用时应该如何处理事务。例如,PROPAGATION_REQUIRED表示如果当前没有事务,就新建一个;PROPAGATION_SUPPORTS表示如果存在事务则加入,否则无需...
### Spring中的Transaction事务传播行为种类详解 #### 一、引言 在开发基于Spring框架的应用程序时,事务管理是确保数据一致性的重要手段之一。Spring框架提供了丰富的事务管理功能,其中包括了事务传播行为...