zoukankan      html  css  js  c++  java
  • Spring入门学习(八)

    声明式事务

    1、事务简介

    • 把一组事务当成一个业务来做:要么都成功,要么都失败!
    • 事务在项目开发中,十分的重要,涉及到数据的一致性问题,不能马虎
    • 确保完整性和一致性

    2、事务的ACID原则

    • 原子性

    • 一致性

    • 隔离性

      • 多个业务可能操作同一个资源,防止数据损坏
    • 持久性

      • 事务一旦提交,无论系统发生什么问题,结果都不会再被影响,被持久化的写到存储器中!

    3、测试事务

    我们来测试一下spring整合mybatis后事务是否符合原则!

    1、修改操作类中的方法

        public List<User> getUserList() {
            UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
            List<User> userList = mapper.getUserList();
    
            mapper.addUser(new User(5,"小王","123456"));
            mapper.deleteUser(5);
    
            return userList;
        }
    

    可以看到,我们将增删查写在一个方法中,相当于将一组事务当成一个业务;

    2、故意将删除的sql语句写错

        <delete id="deleteUser" parameterType="int">
            deletes from user where id=#{id};
        </delete>
    

    3、接下来我们进行测试;

        @Test
        public void getUserListTest(){
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
            UserMapper userMapperImpl2 = (UserMapper) context.getBean("userMapperImpl2");
            List<User> userList = userMapperImpl2.getUserList();
            for (User user : userList) {
                System.out.println(user);
            }
        }
    

    测试结果:

    我们可以看到程序报错了,但是成功插入了新用户,这显然不符合事务的原则,接下来我们配置事务

    4、Spring中的事务管理

    Spring支持两种事务管理:

    • 声明式事务:结合AOP实现事务的织入
    • 编程式事务:需要在代码中,进行事务的管理

    我们主要配置声明式事务!

    1、开启 Spring 的事务处理功能

        <!--开启事务管理首先要创建一个 DataSourceTransactionManager 对象 : 事务管理器-->
        <bean id="transactionMapper" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <constructor-arg ref="dateSources"/>
        </bean>
    

    2、配置事务通知(要导入tx的约束文件)

        <tx:advice id="txAdvice" transaction-manager="transactionMapper">
            <!--给哪些方法配置事务   配置事务的传播特性-->
            <tx:attributes>
                <!--* 表示给所有的方法配置事务     REQUIRED 默认的传播特性-->
                <tx:method name="*" propagation="REQUIRED"/>
            </tx:attributes>
        </tx:advice>
    

    3、配置事务切入

        <aop:config>
            <!--所用类的所有方法-->
            <aop:pointcut id="txPointcut" expression="execution(* com.star.mapper.*.*(..))"/>
            <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
        </aop:config>
    

    4、测试

        @Test
        public void getUserListTest(){
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
            UserMapper userMapperImpl2 = (UserMapper) context.getBean("userMapperImpl2");
            List<User> userList = userMapperImpl2.getUserList();
            for (User user : userList) {
                System.out.println(user);
            }
        }
    

    测试结果:

    可以看到在报错的情况下,插入操作也没有成功,这样就符合事务的原则了!

    配置事务的原因

    • 如果不配置事务,可能存在数据提交不一致的情况下;
    • 如果我们不在SPRING中去配置声明式事务,我们就需要在代码中手动配置事务!
    • 事务在项目的开发中十分重要,设计到数据的一致性和完整性问题,不容马虎!
  • 相关阅读:
    how to uninstall devkit
    asp.net中bin目录下的 dll.refresh文件
    查找2个分支的共同父节点
    Three ways to do WCF instance management
    WCF Concurrency (Single, Multiple, and Reentrant) and Throttling
    检查string是否为double
    How to hide TabPage from TabControl
    获取当前系统中的时区
    git svn cygwin_exception
    lodoop打印控制具体解释
  • 原文地址:https://www.cnblogs.com/lmx-181028/p/12435363.html
Copyright © 2011-2022 走看看