• Spring声明式事务


    一、测试

    沿用上一篇博客“整合Mybatis方式二”项目

    1.1、为实体类添加构造方法

    在这里插入图片描述

    1.2、修改UserMapper接口

    package com.massimo.mapper;
    
    import com.massimo.pojo.Users;
    
    import java.util.List;
    
    public interface UserMapper {
        public List<Users> selectUser();
    
        //添加一个用户
        public int addUser(Users users);
    
        //删除一个用户
        public int deleteUser(int id);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    1.3、修改UserMapper.xml配置文件

    在这里插入图片描述

    1.4、修改UserMapperImpl2实现

    package com.massimo.mapper;
    
    import com.massimo.pojo.Users;
    import org.mybatis.spring.support.SqlSessionDaoSupport;
    
    import java.util.List;
    
    public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper {
    
        public List<Users> selectUser() {
            Users users = new Users(5, "陆小果", "23432523");
            UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
            mapper.addUser(users);
            mapper.deleteUser(5);
            return mapper.selectUser();
        }
    
        public int addUser(Users users) {
            return getSqlSession().getMapper(UserMapper.class).addUser(users);
        }
    
        public int deleteUser(int id) {
            return getSqlSession().getMapper(UserMapper.class).deleteUser(id);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    1.5、测试

    在这里插入图片描述
    查看数据库:
    在这里插入图片描述
    可以发现,即使执行失败,数据也同样被插入了,这是我们不希望看到的。

    二、spring中的事务管理

    • 声明式事务:AOP
    • 编程式事务:需要再代码中,进行事务的管理

    现对以上测试进行优化,如下:

    2.1、删除上面测试插入的数据

    2.2、修改spring-dao.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: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/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">
    
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>
    
    <!--sqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <property name="mapperLocations" value="classpath:com/massimo/mapper/*.xml"/>
    </bean>
    
    
        <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
            <constructor-arg index="0" ref="sqlSessionFactory"/>
        </bean>
    
    <!--配置声明式事务-->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
    
    <!--结合AOP实现事务的织入-->
    <!--配置事务通知:-->
        <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <!--给那些方法配置事务-->
        <!--配置事务的传播性:new  propagation-->
            <tx:attributes>
                <tx:method name="add" propagation="REQUIRED"/>
                <tx:method name="delete" propagation="REQUIRED"/>
                <tx:method name="update" propagation="REQUIRED"/>
                <tx:method name="query" propagation="REQUIRED"/>
                <tx:method name="*" propagation="REQUIRED"/>
            </tx:attributes>
        </tx:advice>
    
    <!--配置事务切入-->
        <aop:config>
            <aop:pointcut id="txPointcut" expression="execution(* com.massimo.mapper.*.*(..))"/>
            <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
        </aop:config>
    
    </beans>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    2.3、测试

    测试后发现,不出意料的执行失败,但是这次数据没有插入。

    三、事务的重要性

    • 如果不配置事务,可能存在数据提交不一致的情况;
    • 如果我们不在SPRING中去配置声明式事务,我们就需要在代码中手动配置事务!
    • 事务在项目的开发中十分重要,涉及到数据的一致性和完整性问题,不容马虎!|
  • 相关阅读:
    含文档+PPT+源码等]精品微信小程序spring boot批发零售业商品管理系统[包运行成功]计算机毕设Java毕设项目源码
    k8s核心组件
    MacOs基于docker搭建linux内核编译与调试环境
    面试题:JS如何最快的执行垃圾回收机制
    本地开机启动jar
    RabbitMQ--基础--06--界面说明
    Nodejs系列之模块成员导出与导入
    openharmony容器组件之Grid
    FTP协议 21
    点云地面滤波--布料模拟滤波(CSF)
  • 原文地址:https://blog.csdn.net/Massimo__JAVA/article/details/125415079