spring事务回滚配置文件方式

标签: spring事务添加
8人阅读 评论(0) 收藏 举报
分类:

目录结构一览:


需要导入的jar包(红色框处的地方是添加事务专门加上的)


新添加配置文件中的约束:


其他文件都跟之前的一样,所以专门说一下配置文件跟如何事务处理的

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:p="http://www.springframework.org/schema/p" 
	xmlns:util="http://www.springframework.org/schema/util"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
        
        <!-- 注解扫描 -->
        <context:component-scan base-package="com.hpe"></context:component-scan>
        
       	<!-- 加载db.properties配置文件,location指定位置 -->
       	<context:property-placeholder location="classpath:db.properties"/>
        
        <!-- 配置c3p0数据源 ,配置c3p0数据源的bean-->
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        	<!-- 注入连接数据库的属性 -->
        	<property name="driverClass" value="${jdbc.driver}"></property>
        	<property name="jdbcUrl" value="${jdbc.url}"></property>
        	<property name="user" value="${jdbc.user}"></property>
        	<property name="password" value="${jdbc.password}"></property>
        </bean>
        
        <!-- 通过spring管理SqlSessionFactory、mapper接口 -->
        
        <!-- 配置sqlSessionFactory的bean -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        	<!-- 配置mybatis核心配置文件的路径 -->
        	<property name="configLocation" value="classpath:SqlMapConfig.xml"></property>
        	<!-- 指定数据源 -->
        	<property name="dataSource" ref="dataSource"></property>
        	<!-- 指定批量创建别名的包 -->
        	<property name="typeAliasesPackage" value="com.hpe.po"></property>
        </bean>
        
        
        <!-- 如何批量创建mapper接口实现类的bean?,bean的id是什么呢 (接口名称,首字母小写)-->
       
       <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
       		
       		<!-- basePackage:指明,创建哪个包下的Mapper接口实现类的bean -->
       		<property name="basePackage" value="com.hpe.mapper"></property>
       		<!-- 指定sqlSessionFactory -->	
       		<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
       			
       </bean>
       
       <!-- spring的声明式事务:xml方式 -->
       
       <!-- 1.配置事务管理器 (不仅xml方式得写,注解方式也得写):配置事务管理器的bean-->
       <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
       		<!-- 数据源 -->
       		<property name="dataSource" ref="dataSource"></property>
       </bean>
       
       <!-- 2.配置事务增强 -->
       <tx:advice id="txAdvice" transaction-manager="transactionManager">
       		<!-- 配置事务属性 
       		propagation:事务的传播行为
       		-->
       		<tx:attributes>
       			<!-- 给那些方法设置什么样的信息 -->
       			<tx:method name="insert*" propagation="REQUIRED" />
       			<tx:method name="delete*" propagation="REQUIRED"/>
       			<tx:method name="update*" propagation="REQUIRED"/>
       			<tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
       		</tx:attributes>
       </tx:advice>
       
       <!-- 3.配置aop事务 -->
       <aop:config>
       		<!-- 配置切入点 -->
       		<aop:pointcut expression="execution(* com.hpe.service.*.*(..))" id="pointcut1"/>
       		<!-- 应用增强 -->
       		<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>
       </aop:config>
</beans>

在UserServiceImpl中,deleteById方法,我们设置个异常,system.out.println(1/0),该语句会出现异常,当我们不提供事务时候,就没有回滚功能,出现异常之前对数据库的操作,会终止,出现异常之后的语句,不会执行,这是我们不想看到的。我们希望出现异常后,一切对数据库的操作都会还原。

package com.hpe.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.hpe.mapper.UserMapper;
import com.hpe.po.User;
import com.hpe.service.IUserService;

@Service
public class UserServiceImpl implements IUserService {
	
	@Autowired
	private UserMapper userMapper;
	
	
	@Override
	public User selectUserById(int id) {
		
		return userMapper.selectUserById(id);
		
	}

	public int deleteUserById(int id) {
		userMapper.deleteUserById(id);
		System.out.println(1/0);
		userMapper.deleteUserById(id+1);
		return 0;
	}

}

我们可以用junit测试,不加事务处理,userMapper.deleteUserById(id);会在数据库生效,但是加上事务,虽然执行了,但是回滚以后,数据库不会有变化,即删除功能失效。

package com.hpe.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.hpe.po.User;
import com.hpe.service.IUserService;

public class SpringMyBatisTest {
	
	@Test
	public void test()
	{
		
		ApplicationContext context= new ClassPathXmlApplicationContext("applicationContext.xml");
		
		IUserService userService = context.getBean(IUserService.class);
		
		User user = userService.selectUserById(7);
		
		System.out.println(user);
	}
	
	@Test
	public void test1()
	{
		
		ApplicationContext context= new ClassPathXmlApplicationContext("applicationContext.xml");
		
		IUserService userService = context.getBean(IUserService.class);
		
		int res = userService.deleteUserById(6);
		
		System.out.println(res);
		
	}

}


查看评论

关于Spring事务回滚的配置及使用

在Spring的配置文件中,如果数据源的defaultAutoCommit设置为True了,那么方法中如果自己捕获了异常,事务是不会回滚的,如果没有自己捕获异常则事务会回滚,如下例 比如配置文件里有...
  • sinat_29325027
  • sinat_29325027
  • 2016-04-10 17:55:46
  • 1347

spring事务回滚规则

spring事务回滚规则 指示spring事务管理器回滚一个事务的推荐方法是在当前事务的上下文内抛出异常。spring事务管理器会捕捉任何未处理的异常,然后依据规则决定是否回滚抛出异常的事务。 ...
  • serena886
  • serena886
  • 2016-09-07 12:28:09
  • 1264

Spring学习-回滚事务之修改默认回滚类型

今天发现了个奇怪的问题,自定义的异常(extens Exception)抛出的异常既然不会滚,然后查了下资料,原来spring默认回滚RuntimeException(及其下所有子类)。 解决办法: ...
  • icoudsoft_saas
  • icoudsoft_saas
  • 2016-08-15 10:51:38
  • 583

Spring嵌套事务机制以及不同策略的配置实现

通常使用Spring框架的程序会统一的在Service层运用Spring AOP进行事务控制,分为声明式和编程式两种,互联网上已经有很多的资源介绍Spring事务的配置,Spring Referenc...
  • kimylrong
  • kimylrong
  • 2012-06-13 17:01:11
  • 9796

关于spring中事务不回滚的解决方式

关于spring中事务不回滚的问题,网上查了很多资料,基本有如下可能性: 假如我们把事务加到Service层: 1.Service层的方法我们try...catch了,导致AOP捕...
  • jsflzhong
  • jsflzhong
  • 2016-12-09 15:31:29
  • 723

Spring 事务回滚机制

摘要: Spring事物回滚 异常回滚示例 捕获异常,不抛出,事物不能回滚!!! if(userSave){               try {                  use...
  • fly910905
  • fly910905
  • 2017-02-08 18:04:38
  • 478

SpringMVC Mybatis的事务回滚问题

采用的基本搭建环境:SpringMVC、MyBatis、MySQL、tomcat         Spring事务管理分解了传统的全局事务管理和本地事务管理的劣势,使得在任何环境中都可以使用统一的事...
  • lzl13391522110
  • lzl13391522110
  • 2016-11-22 17:56:51
  • 863

Mysql-spring事务回滚

已经标记:@Transactional(rollbackFor={RuntimeException.class 并且没有网友说的try catch,已经抛出了RuntimeException,但是还...
  • jzdzhiyun
  • jzdzhiyun
  • 2016-10-12 14:51:34
  • 690

Spring/SpringMVC/MyBatis整合+事务回滚

  • 2016年02月24日 11:33
  • 25.61MB
  • 下载

spring 事务是否会回滚的几种写法

spring 事务注解 默认遇到throw new RuntimeException("...");会回滚 需要捕获的throw new Exception("...");不会回滚 // 指定回滚...
  • zh521zh
  • zh521zh
  • 2016-09-28 09:50:22
  • 1070
    个人资料
    持之以恒
    等级:
    访问量: 11万+
    积分: 2859
    排名: 1万+
    最新评论