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中去配置声明式事务,我们就需要在代码中手动配置事务!
    • 事务在项目的开发中十分重要,设计到数据的一致性和完整性问题,不容马虎!
  • 相关阅读:
    POJ 1984
    剑指offer 7. 斐波那契数列 & leetcode 剑指 Offer 10- I. 斐波那契数列
    剑指offer 60. 把二叉树打印成多行
    数据库的范式(建表的原则)
    剑指offer 59. 按之字形顺序打印二叉树
    力扣142.环形链表II & 剑指offer 55. 链表中环的入口结点
    GET 和 POST 的区别
    理解Cookie和Session的区别及使用
    基本排序算法代码实现,以及使用场景推荐
    The Castle OpenJ_Bailian
  • 原文地址:https://www.cnblogs.com/lmx-181028/p/12435363.html
Copyright © 2011-2022 走看看