`
angelbill3
  • 浏览: 255592 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

SpringMVC 声明式事务配置以及问题解决

 
阅读更多
百度定义:
声明式事务:声明式事务(declarative transaction management)是Spring提供的对程序事务管理的方式之一。
Spring的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明,就是指在配置文件中申明。用在Spring配置文件中声明式的处理事务来代替代码式的处理事务。这样的好处是,事务管理不侵入开发的组件,具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实上也应该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事务管理策划的话,也只需要在定义文件中重新配置即可;在不需要事务管理的时候,只要在设定文件上修改一下,即可移去事务管理服务,无需改变代码重新编译,这样维护起来极其方便。
Spring使用AOP来完成声明式的事务管理,因而声明式事务是以方法为单位。

首先来看看正确的完整配置:
Spring核心配置文件 applicationContext.xml
<!-- 声明事务 -->  
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
    <property name="dataSource" ref="dataSource" />  
</bean>  

<aop:config>
    <aop:pointcut id="serviceOperation" expression="execution(* com.service.impl.*.*(..))" />
    <aop:advisor pointcut-ref="serviceOperation" advice-ref="txAdvice" />
</aop:config>

<!--启动spring注解功能-->    
<tx:annotation-driven transaction-manager="transactionManager" />

<tx:advice id="txAdvice" transaction-manager="transactionManager">
	<tx:attributes>
		<tx:method name="update*" propagation="REQUIRED"/>
        	<tx:method name="save*" propagation="REQUIRED"/>
        	<tx:method name="add*" propagation="REQUIRED"/>
        	<tx:method name="create*" propagation="REQUIRED"/>
        	<tx:method name="do*" propagation="REQUIRED"/>
        	<tx:method name="del*" propagation="REQUIRED"/>
        	<tx:method name="remove*" propagation="REQUIRED"/>
		<tx:method name="get*" read-only="true" />
		<tx:method name="query*" read-only="true" />
		<tx:method name="find*" read-only="true" />
		<tx:method name="*"/>
	</tx:attributes>
</tx:advice>

<context:component-scan base-package="com.test">
	<!--将Controller的注解排除掉 --> 
  	<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>


SpringMVC配置文件 spring-servlet.xml
<!-- 注解模式 -->
<context:component-scan base-package="com.test" use-default-filters="false"> 
	<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>


Service层示例:(底层使用了Mybatis,在此篇不作详细介绍,具体请看下面相关URL。
TestServiceImpl.java
@Service
public class TestServiceImpl implements TestService{
	@Resource
	private UserMapper userMapper;
	
	public void addUser() throws Exception{
		User useri = new User();
		useri.setUsername("222");
		useri.setPassword("222");
		this.userMapper.insert(useri);
		throw new RuntimeException();//主动抛错,为了测试有没新增。若成功,则说明事务无效,若不能新增,则说明已回滚。
	}
}

Controller测试类省略。经测试能回滚。

-------------------------------------
问题一:起始因为没有配置applicationContext.xml最后一个配置,导致事务失效,网上查了下原因,如果带上事务,那么用annotation方式的事务注解和bean配置,事务会失效,要将service bean配置到xml文件中才行。
因 为spring的context是父子容器,所以会产生冲突,Controller会先进行扫描装配,而此时的Service还没有进行事务的增强处理, 得到的将是原样的Service(没有经过事务加强处理,故而没有事务处理能力) ,最后才是applicationContext.xml中的扫描配置进行事务处理。


即:
mvc 的只扫描controller组件 注意使用 use-default-filters="false" 
<context:component-scan base-package="com.fengzhiyin" use-default-filters="false" > 
<context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/> 
</context:component-scan> 

主体的扫描除controller外的所有组件 
<context:component-scan base-package="com.fengzhiyin" > 
<context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/> 
</context:component-scan> 


补充:对于use-default-filters="false"的解释:
如果不设置use-default-filters="false",则Spring会扫描并优先注册默认的bean(当然包括标记为@Service的bean),这样,标记为@Transactional的service由于transaction manager尚未注册而未能生效,导致事务管理失效。
原理是:标记为@Transactional的service会wrap为经过transactional proxied(不管是CGLIB based或是JDK based)的bean,而不再是纯的service;

问题二:若要测试事务,有很多种方式,(只要测出会回滚就行),但千万别在Service里抛出一个Exception,来做为测试事务的方式。
规则如下:
默认遇到throw new RuntimeException("...");会回滚
需要捕获的throw new Exception("...");不会回滚


原因是抛出的Exception,在数据库层默认是“超时”错误。
当然这个可以通过类似@Transactional(rollbackFor=Exception.class)的来重新配置。

-----------------------------
参考资料:
http://www.cnblogs.com/rushoooooo/archive/2011/08/28/2155960.html
分享到:
评论
3 楼 zhumingpeng 2014-11-14  
angelbill3 写道
zhumingpeng 写道
楼主  能把事务放倒 Controller 做吗


能做,但不推荐。

为什么呢 求指点
2 楼 angelbill3 2014-10-15  
zhumingpeng 写道
楼主  能把事务放倒 Controller 做吗


能做,但不推荐。
1 楼 zhumingpeng 2014-10-11  
楼主  能把事务放倒 Controller 做吗

相关推荐

    springmvc+mybatis+声明式事务管理

    在IT行业中,SpringMVC、MyBatis以及声明式事务管理是Java Web开发中的关键组件。这个项目结合了这三个核心技术,构建了一个高效、稳定的后端系统。以下将详细阐述这些技术及其相互配合的工作原理。 首先,...

    SpringMVC配置多数据源实战

    在SpringMVC框架中配置多数据源是一项常见的需求,尤其在大型企业级应用中,由于业务的复杂性,往往需要连接不同的数据库以满足不同模块的需求。以下将详细讲解如何实现这一功能。 首先,理解数据源(DataSource)...

    spring声明式事务配置

    根据提供的信息,我们可以深入探讨Spring框架中的声明式事务配置及其多种实现方式。声明式事务管理是一种简化事务管理的方式,它允许开发人员通过配置而非编程来指定事务边界,从而减少了代码的复杂性并提高了可维护...

    springMVC+MYBATIS事务管理

    声明式事务管理是通过在配置文件或注解中定义事务边界来实现的。在SpringMVC+MyBatis的应用中,通常会在Service层方法上添加@Transactional注解,指定事务属性如隔离级别、传播行为等。当方法执行过程中出现异常时...

    SpringMVC事务管理

    2. XML配置的声明式事务管理:这是Spring提供的更常见、更推荐的方式。在Spring的配置文件中定义事务管理器,然后通过、和等元素声明事务的传播行为、隔离级别、超时时间等属性。例如: ```xml *" ...

    springmvc事务配置到controller.zip

    在Spring MVC框架中,...压缩包中的"springmvc事务配置到controller"可能包含具体的配置文件、Controller代码以及相关解释,供学习者参考和实践。通过这种方式,开发者可以专注于业务逻辑,而无需关心事务管理的细节。

    SpringMVC核心配置文件示例.rar

    Spring MVC支持声明式事务管理,这可以在`&lt;tx:annotation-driven&gt;`标签中配置,使得@Transactional注解能驱动事务处理: ```xml ``` 其中,`transactionManager`应指向事务管理器的Bean。 4. **视图解析器**...

    SpringMVC+Hibernate5 项目配置Demo

    - **Transaction管理**:配置事务管理,可以选择编程式或声明式。 3. **整合SpringMVC与Hibernate5** - **SessionFactory注入**:在Spring的配置文件中,将SessionFactory作为bean定义,然后通过@Autowired注入到...

    Spring+SpringMVC配置事务管理无效原因及解决办法详解

    编程式事务管理需要手动编写事务管理代码,而声明式事务管理使用注解或 XML 配置来管理事务。 Spring+SpringMVC 配置事务管理无效原因 在使用 Spring 和 SpringMVC 配置事务管理时,可能会遇到事务管理无效的问题...

    Springmvc tx标签事务管理

    `Springmvc tx`标签主要用于声明式事务管理,这种方式让开发者无需在业务代码中显式管理事务,而是通过配置来定义事务的边界和行为。本文将深入探讨Spring MVC中的事务管理,以及服务器启动时加载顺序对事务管理的...

    SpringMVC+MyBatis 事务管理(实例)

    本文主要讨论了SpringMVC+MyBatis事务管理的相关知识,涵盖了编程式注解事务和基于注解的声明式事务两种方式。 1. Spring事务管理的分类 Spring事务管理可以分为两种情况:编程式事务和声明式事务。其中,声明式...

    SpringMVC+MyBatis声明式事务管理

    总结起来,SpringMVC与MyBatis结合的项目中,声明式事务管理通过Spring的`DataSourceTransactionManager`、注解@Transactional以及正确配置的组件扫描,实现了事务的自动化管理,极大地简化了事务处理的工作,同时也...

    SpringMVC配置文件以及jar包

    7. **spring-tx.jar**:提供了事务管理支持,如编程式和声明式事务。 8. **jstl.jar**和**standard.jar**:用于在JSP页面中执行标签库,如条件判断、循环等。 9. **servlet-api.jar**和**jsp-api.jar**:这两个是...

    集成springmvc spring hibernate的配置

    5. **事务管理器配置**:使用`@Transactional`注解进行声明式事务管理,配置事务管理器`txManager`: ```xml ``` 接下来,配置Spring MVC的`springmvc-servlet.xml`文件,主要包含以下部分: 1. **组件扫描**...

    SpringMVC+ibatis整合

    - **事务管理**:SpringMVC和iBatis整合后,可以利用Spring的声明式事务管理,简化事务控制。 - **缓存支持**:iBatis支持二级缓存,结合Spring的缓存抽象,可以实现更高效的缓存策略。 - **AOP编程**:Spring...

    Spring+SpringMVC+Mybatis框架搭建(含事务管理)

    Spring提供了一种声明式事务管理方式,通过在方法上添加@Transactional注解,可以自动管理事务的开始、提交、回滚。如果方法执行过程中发生异常,Spring会自动回滚事务;如果没有异常,则在方法结束后提交事务。这种...

    springmvc_mybatis3.01.zip_SpringMVC事务_漏洞

    - **声明式事务管理**:Spring通过@Transactional注解实现,可以在方法级别或类级别声明事务边界,异常发生时,事务会自动回滚。 - **编程式事务管理**:使用PlatformTransactionManager接口和...

    springmvc与hibernate整合

    - 集成事务管理:Spring提供声明式事务管理,通过配置tx namespace,将事务管理与业务代码解耦。在Service层方法上添加@Transactional注解,Spring会自动管理事务的开启、提交或回滚。 4. **Spring的事务处理**:...

    SpringMVC实现一个完整的项目

    声明式事务管理则通过在方法上添加`@Transactional`注解,由Spring容器自动处理事务边界。 **四、SpringMVC的工作流程** 1. 用户发送HTTP请求到 DispatcherServlet。 2. DispatcherServlet 根据请求映射找到对应的 ...

Global site tag (gtag.js) - Google Analytics