SpringMVC的事务配置以及使用 - Go语言中文社区

SpringMVC的事务配置以及使用


自己学习然后搭建了一个Spring+SpringMVC+Mybatis的框架,然后实现事务

这里是事务的配置


<!-- 配置数据源 使用的是Druid数据源 -->
<bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <!-- 用来检测有效sql -->
    <property name="validationQuery" value="${validationQuery}" />
    ......
</bean>


<!-- 配置事务管理 -->
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

<!-- 拦截器方式配置事物 -->
<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <!-- 必须要有事务,没有则创建 -->
        <tx:method name="insert*" propagation="REQUIRED" />
        <tx:method name="update*" propagation="REQUIRED" />
        <tx:method name="delete*" propagation="REQUIRED" />
        <!-- 可以有可以没有 -->
        <tx:method name="get*" propagation="SUPPORTS" read-only="true" />
        <tx:method name="find*" propagation="SUPPORTS" read-only="true" />
        <tx:method name="select*" propagation="SUPPORTS" read-only="true" />
    </tx:attributes>
</tx:advice>


<!-- Spring aop事务管理 -->
<aop:config>
    <aop:pointcut id="transactionPointcut" expression="execution(* com.sanguo.service.impl..*Impl.*(..))" />
    <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice"/>
</aop:config>

如果不会配置的可以自己在网上找其他博客,里面有详细配置ssm项目的配置,在这里推荐一个
http://blog.csdn.net/gebitan505/article/details/44455235/

配置好之后写了个测试类去实验一下

public int insertList(List<User> userList) {

        for (User user : userList) {
            userMapper.insert(user);
        }

        return 1;
 }

这里写图片描述
这里写图片描述
第一次运行插入list里面的user数据没有问题,因为这个没有异常,可以很好的运行下去,主键也自动增加了5个
之后我就想在程序运行出现异常看看能否完成插入,看看数据能不能回滚

public int insertList(List<User> userList){

        for (User user : userList) {
            userMapper.insert(user);
        }
        int s = 1 / 0;
        return 1;
    }

这次我写了一个“1/0”,这样运行就会出错,这样让程序出错看看能否增加成功

这里写图片描述
这里写图片描述

这次可以看见主键确实是增加了,但是数据确没有添加成功,说明事务确实是配置成功了

但是我听说事务成功需要把异常去抛出来,于是我试了一下把异常捕获,然后解决看一下

public int insertList(List<User> userList){

       for (User user : userList) {
            userMapper.insert(user);
        }
        int s = 0;
        try {
            s = 1 / 0;
        } catch (Exception e) {
            // 捕获了异常,并把异常信息打印
            e.printStackTrace();   
        }
        return 1;
    }

在运行的时候把这个会出现异常的代码try-catch,然后去运行

这里写图片描述
这里写图片描述

这里写图片描述

看到,控制台确实有异常,并且也打印出了结果,把异常捕获之后,确实可以插入成功

然后我再尝试把异常给抛出去看看能够添加成功不,于是又改造了一下方法

public int insertList(List<User> userList) throws  Exception{

       for (User user : userList) {
            userMapper.insert(user);
        }
        int s = 0;
        try {
            s = 1 / 0;
        } catch (Exception e) {
            e.printStackTrace(); 
            throw e;// 抛出异常
        }
        return 1;
    }

这里写图片描述

这里写图片描述

可以看到主键增加了,但是数据库数据并没有增加,说明事务确实成功

总结:

事务配置确实是有用的,但是在使用事务的时候,需要在某个service中去把异常抛出来,不能去try-catch的解决它,只有在service中抛出来然后又异常,事务才能够真正的起作用。
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weishujie000/article/details/79051255
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-06 22:47:29
  • 阅读 ( 1178 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢