• SSM框架——以注解形式实现事务管理


               上一篇博文《SSM三大框架整合具体教程》具体说了怎样整合Spring、SpringMVC和MyBatis这三大框架。

    可是没有说到怎样配置mybatis的事务管理,实现开发中,事务是不可缺少的。本篇作为对上一篇的补充,说明在SSM框架中怎样使用注解的形式进行事务管理


    什么是事务?

              在编写业务的过程中,会须要进行事务处理,当须要运行多条插入语句时。假设前几条成功。而最后一条失败。那么我们须要回滚数据库操作,保持数据的一致性和完整性,此时,就须要利用DB的事务处理。

    事务是恢复和并发控制的基本单位。


            简单来说。所谓的事务,是一个操作序列。这些操作要么都运行。要么都不运行,它是一个不可切割的工作单位。


    事务应该具有4个属性:原子性、一致性、隔离性、持久性。

    这四个属性通常称为ACID特性。


           原子性(atomicity)。一个事务是一个不可切割的工作单位,事务中包含的诸操作要么都做,要么都不做。


           一致性(consistency)。事务必须是使数据库从一个一致性状态变到还有一个一致性状态。

    一致性与原子性是密切相关的。


           隔离性(isolation)。一个事务的运行不能被其它事务干扰。

    即一个事务内部的操作及使用的数据对并发的其它事务是隔离的。并发运行的各个事务之间不能互相干扰。


           持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其有不论什么影响。



    MyBatis集成Spring事务管理

               在SSM框架中。使用的是Spring的事务管理机制。

    Spring能够使用编程式实现事务声明式实现事务以及注解式实现事务。

    本文主要说一下怎样使用注解式@Transanctional实现实现事务管理。


    本文代码样例基于上一篇博文,具体代码《SSM三大框架整合具体教程》中已经给出。简单看下文件夹结构以及实体类:



    1、配置spring-mybatis.xml文件

           

             如要实现注解形式的事务管理。仅仅须要在配置文件里增加下面代码就可以:


    <!-- 开启事务注解驱动 -->
    	<tx:annotation-driven />
    	<!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
    	<bean id="transactionManager"
    		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    		<property name="dataSource" ref="dataSource" />
    	</bean>

               

                当然,假设此时xml文件报错。那是因为没有引入xmlns和schema导致的。无法识别文档结构。引入头文件就可以。下面是我的。依据自己须要引入:


    <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:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc"
    	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    	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/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
        					http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
                            http://www.springframework.org/schema/mvc  
                            http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">



    2、怎样使用


              在此用一个小样例来測试事务管理是否成功配置。代码基础是SSM框架搭建里面的測试代码。

    我们如今測试的方法是:我要插入一个User对象的集合。假设此对象数量小于2,那么能够成功插入。可是假设大于2。那么就抛出异常(事务处理必须抛出异常,仅仅有这样Spring才帮助事务回滚)。这样数据库就会回滚,不插入不论什么数据。測试结果假设数据库没插入不论什么数据。那么表示事务处理配置成功,反正,失败。

         注意@Transactional仅仅能被应用到public方法上,对于其他非public的方法。假设标记了@Transactional也不会报错,但方法没有事务功能。 


            实体类、DAO接口。业务接口,以及业务实现都有。这个測试仅须要在业务层中加入一个方法,然后使用JUnit測试就可以。业务实现类中加入例如以下方法,注意注解@Transactional

    /**
    	 * 事务处理必须抛出异常。Spring才会帮助事务回滚
    	 * @param users
    	 */
    	
    	@Transactional
    	@Override
    	public void insertUser(List<User> users) {
    		// TODO Auto-generated method stub
    		for (int i = 0; i < users.size(); i++) {
    			if(i<2){
    				this.userDao.insert(users.get(i));
    			}
    			else {
    				throw new RuntimeException();
    			}
    		}
    	}

    接下来在測试类中加入例如以下方法进行測试:


    @Test
    	public void testTransaction(){
    		List<User> users = new ArrayList<User>();
    		for(int i=1;i<5;i++){
    			User user = new User();
    			user.setAge(i);
    			user.setPassword(i+"111111");
    			user.setUserName("測试"+i);
    			users.add(user);
    		}
    		this.userService.insertUser(users);
    	}


             注意:此时进行JUnit測试会发现出现错误,这是由于方法中抛出了这个异常。实质上确实进行了事务管理,数据没有插入,此时表示配置成功了;反之,假设去掉注解。那么前两条数据会插入成功。然后后面会抛出异常。


    (原文地址:http://blog.csdn.net/zhshulin

  • 相关阅读:
    关于oracle当中数据类型转换的问题
    CASE WHEN的两种格式
    C#设置默认打印机
    运用Merge Into实现增加或更新数据
    增加或修改的存储过程
    深拷贝与浅拷贝
    sql server两种分页方法
    获取sql执行时间
    inserted触发器,一张表插入数据时,同时向另外一张表插入数据
    List<string[]> 如何去重
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6767948.html
Copyright © 2020-2023  润新知