文档章节

SpringMVC 事务管理(DataSourceTransactionManager)spring的相关配置

小爪进击者
 小爪进击者
发布于 2017/05/18 15:53
字数 1342
阅读 116
收藏 0

最近开发项目遇到spring事务回滚不了的问题,经过公司大师的指点终于可以了,现在跟大家 分享一下:

首先需要在web.xml配置如下信息,整个项目的入口都在这里:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<display-name>Vlike</display-name>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
<!-- 我把数据库的配置和spring的其他配置分开写  jdbc-context.xml-->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:jdbc-context.xml</param-value>
	</context-param>
	<!-- log4j配置,文件路径,因为是跟随项目启动 -->
	<context-param>
		<param-name>log4jConfigLocation</param-name>
		<param-value>classpath:log4j.properties</param-value>
	</context-param>

	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
		<init-param>
			<param-name>ForceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
<!--加载spring的主要配置 springMvc3-servlet.xml-->
	<servlet>
		<servlet-name>springMvc3</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:springMvc3-servlet.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<session-config>
		<session-timeout>120</session-timeout>
	</session-config>
	<servlet-mapping>
		<servlet-name>springMvc3</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
	</welcome-file-list>
	<error-page>
		<error-code>404</error-code>
		<location>/Vlike/page404.html</location>
	</error-page>
	<error-page>
		<exception-type>java.lang.NullPointerException</exception-type>
		<location>/Vlike/WEB-INF/jsp/error.jsp</location>
	</error-page>
</web-app>

关于数据库事务的spring的配置jdbc-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:aop="http://www.springframework.org/schema/aop"  
    xmlns:tx="http://www.springframework.org/schema/tx"  
    xmlns:context="http://www.springframework.org/schema/context"  
    xsi:schemaLocation="   
          http://www.springframework.org/schema/beans   
          http://www.springframework.org/schema/beans/spring-beans-3.1.xsd   
          http://www.springframework.org/schema/tx   
          http://www.springframework.org/schema/tx/spring-tx-3.1.xsd  
          http://www.springframework.org/schema/context   
          http://www.springframework.org/schema/context/spring-context-3.1.xsd   
          http://www.springframework.org/schema/aop   
          http://www.springframework.org/schema/aop/spring-aop-3.1.xsd" default-autowire="byName">
    <!-- 启用注解 -->
	<context:annotation-config />
	<!-- 启动组件扫描,排除@Controller组件,该组件由SpringMVC配置文件扫描 -->
	<context:component-scan base-package="com">
		<context:exclude-filter type="annotation"
			expression="org.springframework.stereotype.Controller" />
	</context:component-scan>
	
     	<!-- 创建数据源   commons-dbcp.jar;     commons-pool.jar包-->
     <context:property-placeholder location="classpath:database.properties"/>
	 <bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="${jdbc.driverClassName}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
	 </bean>

   	 <bean id="simpleJdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
		<constructor-arg><ref bean="dataSource"/></constructor-arg>
	 </bean> 
    
   	 <!-- 看了spring源码,该 org.springframework.jdbc.core.JdbcTemplate类的继承类有dataSource属性,所以可以属性注入-->
     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
	     <property name="dataSource">
	         <ref bean="dataSource"/>
	     </property>
     </bean>
     <!--声明DataSourceTransaction事务-->
     <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
     	<property name="dataSource" ref="dataSource"></property>
     </bean>
     
     <!-- 声明式事务管理 注意<tx:method name的写法,具体管理在sevice层@Transactional下面的方法-->
     <tx:advice id="myAdvice" transaction-manager="txManager">
     	<tx:attributes>
     		<tx:method name="add*" propagation="REQUIRED" read-only="false"  isolation="READ_COMMITTED"
			           rollback-for="java.lang.Exception"/>
     		<tx:method name="update*" propagation="REQUIRED" read-only="false"  isolation="READ_COMMITTED"
			           rollback-for="java.lang.Exception"/>
     		<tx:method name="save*" propagation="REQUIRED" read-only="false"  isolation="READ_COMMITTED"
			           rollback-for="java.lang.Exception" />
       		<tx:method name="del*" propagation="REQUIRED" read-only="false"  isolation="READ_COMMITTED"
			           rollback-for="java.lang.Exception"/>
       		<tx:method name="*" propagation="REQUIRED" read-only="false" isolation="READ_COMMITTED"
			           rollback-for="java.lang.Exception"/>
       		<tx:method name="find*" read-only="false"  isolation="READ_COMMITTED"/>
       		<tx:method name="get*" read-only="false" isolation="READ_COMMITTED"/>
     	</tx:attributes>
     </tx:advice>
<!--aop定义具体事务扫描的是那些包-->
      <aop:config>
     	<aop:advisor pointcut="execution(* com.imcore.*.service.impl.*Impl.*(..))" advice-ref="myAdvice"/>
     </aop:config>
</beans>

spring的其他配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"  
    xmlns:context="http://www.springframework.org/schema/context"  
    xmlns:mvc="http://www.springframework.org/schema/mvc"  
    xsi:schemaLocation="   
           http://www.springframework.org/schema/beans   
           http://www.springframework.org/schema/beans/spring-beans-3.1.xsd   
           http://www.springframework.org/schema/context   
           http://www.springframework.org/schema/context/spring-context-3.1.xsd  
           http://www.springframework.org/schema/mvc   
           http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
    
    <!-- 启动项目时扫描所有的注解 -->
    <context:component-scan base-package="com.imcore.*.action"/>
   <mvc:annotation-driven>
    	<mvc:message-converters>
			<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>apolication/json;charset=UTF-8</value>
                        <value>text/html;charset=UTF-8</value>
                   </list>
                </property>
            </bean>
		</mvc:message-converters>
	</mvc:annotation-driven>
    
    <!-- 这里拦截器还有一种配置方法【针对路径进行配置】 推荐使用这个,方便直观-->
    <mvc:interceptors>
    	<mvc:interceptor>
    		<mvc:mapping path="/system/*/*"/>
    		<mvc:mapping path="/system/*"/>
    		<mvc:mapping path="/system/"/>
    		<mvc:mapping path="/system"/>
			<bean class="com.imcore.base.interceptor.SysAdminInterceptor"></bean>
    	</mvc:interceptor>
    </mvc:interceptors>
    
  
    <!-- 配置js,css等静态文件直接映射到对应的文件夹,不被DispatcherServlet处理 -->
    <mvc:resources location="/WEB-INF/resources/**" mapping="/resources"/>
    <mvc:resources mapping="/javascript/**" location="/static_resources/javascript/"/>  
    <mvc:resources mapping="/styles/**" location="/static/css/"/>  
    <mvc:resources mapping="/images/**" location="/static/images/"/> 
    
    <!-- 配置页面访问地址www.xxx.com/about返回的静态html文件 -->
    <mvc:resources mapping="/about/**" location="/WEB-INF/html/"/>
    <!-- 走servlet的默认配置,先走默认的web.xml配置的servlet,没有的话才找对应controller -->
    <mvc:default-servlet-handler />
    
    <!-- jsp页面解析器,当Controller返回XXX字符串时,先通过拦截器,然后该类就会在jsp/目录下,查找XXX.jsp文件-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    	<property name="prefix" value="/WEB-INF/jsp/"></property>
    	<property name="suffix" value=".jsp"></property>
    </bean>
       <!--对上传的图片进行上传大小的限制-->
    <bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<property name="defaultEncoding">
			<value>UTF-8</value>
		</property>
		<property name="maxUploadSize">
			<value>32505856</value><!-- 上传文件大小限制约为31M,略大于1024*1024*31 -->
		</property>
		<property name="maxInMemorySize">
			<value>4096</value>
		</property>
	</bean>
</beans>

接下来就开始在service层开始测试事务会不会回滚了,我们需要在service层的方法中写如下代码,然后遇到异常应该手动写RuntimeException异常抛出,然后如果你不想再前端看到500的错误,在你调用该service层的方法的时候controller层中需要进行try catch处理,不能再service层中进行try  catch处理,亲测使用try catch块包住之后,当第二条sql发生异常,并不会回滚

@Transactional
	public boolean updateNewUserName(String newUserName, String userName) {
		boolean userFlag = false;
		boolean soundFlag = false;
		userFlag = userDao.updateNewUserName(newUserName, userName);
		soundFlag = soundDao.updateNewUserName(newUserName, userName);
		if (!userFlag || !soundFlag) {
			logger.error("数据库更新异常,回滚数据");
            //spring容器当遇到RuntimeException的时候才会进行回滚,所以需要我们手动的抛出,当时由于我没有手动抛出下面的异常,所以数据一直没有回滚
			throw new RuntimeException("数据库更新异常,回滚数据");
		}
		return soundFlag && userFlag;
	}

分享完毕!谢谢大家,有不足的地方欢迎大家交流,大家共同进步。

© 著作权归作者所有

小爪进击者
粉丝 7
博文 60
码字总数 27167
作品 0
厦门
程序员
私信 提问
Spring 声明式注解事务实现机制

Spring中注解事务实现机制 在使用@Transactional 注解管理事务时步骤很简单。但是如果对@Transactional理解不够透彻,很容易出现事务不起作用的情况。所以,在对@Transactional的实现机制要有...

狂奔的熊二
2018/09/21
0
0
MyBatis3整合Spring3的Transaction事务处理

正如第二版,Spring 仅支持 iBatis2。那么我们就想将 MyBatis3 的支持加入到 Spring3.0(参考 Spring 的 Jira 的问题)中。 不幸的是,Spring 3.0 的开发在 MyBatis 3.0 官方发布前就结束了。...

鉴客
2012/02/23
2.8K
0
SpringBoot 的事务管理

Springboot内部提供的事务管理器是根据autoconfigure来进行决定的。 比如当使用jpa的时候,也就是pom中加入了spring-boot-starter-data-jpa这个starter之后。 Springboot会构造一个JpaTransa...

濡沫
2018/08/13
0
0
Spring声明型事务管理示例详解

Spring不直接实现管理事务,它只是管理哪些方法需要有事务,通过AOP的方式调用底层的事务管理器进行事务管理.有需要事务管理的类是被Spring代理创建的,代理类通过在连接点前后插入预处理过程(...

晨曦之光
2012/04/25
2.5K
1
SpringBoot的事务管理你会了么?

Springboot内部提供的事务管理器是根据autoconfigure来进行决定的。 比如当使用jpa的时候,也就是pom中加入了spring-boot-starter-data-jpa这个starter之后(之前我们分析过springboot的自动化...

Java高级架构师
2018/08/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

技术分享 | delete大表slave回放巨慢的问题分析

原创作者: 洪斌 问题 在master上执行了一个无where条件delete操作,该表50多万记录。binlog_format是mixed模式,但transaction_isolation是RC模式,所以dml语句会以row模式记录。此表没有主键...

爱可生
27分钟前
1
0
Tableau BI工具对接 AnalyticDB for PostgreSQL数据源

AnalyticDB for PostgreSQL(原HybridDB for PostgreSQL)作为高性能分析型数据库,可以支持用户对其业务数据进行实时分析,能够让企业敏锐感知市场动态,做出必要决策。 Tableau是一款数据分...

阿里云云栖社区
27分钟前
2
0
《后端架构师技术图谱》

推荐: 《Java技术书籍大全》 - awesome-java-books 从初级开发者到资深架构师,看这些书就够了 数据结构 队列 集合 链表、数组 字典、关联数组 栈 树 二叉树 完全二叉树 平衡二叉树 二叉查找...

哥本哈根的小哥
33分钟前
3
0
iTOP-4418开发板-QtE5.7系统-10.1寸屏触摸

本文档介绍 iTOP-4418开发板的 QtE 系统(QtE5.7 的需要修改,QtE4.7 默认支持)的 10.1 寸屏触摸的配置方法。 目前迅为的触摸屏从驱动芯片的方案区分,主要为:TSC2007 系列、ft5x0x_ts 系列...

书白
38分钟前
0
0
linux 脚本文件,后台运行jar包并输出日志

#!/bin/bash#chkconfig: 345 90 10#description: Starts and stops the shaungluJava daemon.######################################################################### Purpose:......

west_coast
45分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部